我有一个字节,其在二进制值是11111111我必须根据这些规则我的字节扩展到16位0101010101010101:如果位= 1,现在是01.如果位= 0,现在是10我如何屏蔽位?
例如:
00001111 -> 1010101001010101
00000101 -> 1010101010011001
这样做的操作是什么?
我有一个字节,其在二进制值是11111111我必须根据这些规则我的字节扩展到16位0101010101010101:如果位= 1,现在是01.如果位= 0,现在是10我如何屏蔽位?
例如:
00001111 -> 1010101001010101
00000101 -> 1010101010011001
这样做的操作是什么?
我不认为有一个运营商的“扩大”位如上所述。 但是你可以在移和测试位如下一起做一个循环:
unsigned char b = 0xff;
unsigned int result = 0x0;
for (int i=0; i<8; i++) {
result <<= 2; // make place for the next 2 bits
int isSet = b & 0x80; // check highest significant bit of b
if (isSet) {
result |= 0x01; // in bits: 01
}
else {
result |= 0x02; // in bits: 10
}
b <<= 1;
}
希望它能帮助。
就是这样!谢谢 –
不客气。如果它解决了你的问题,请不要忘记接受答案...... –
首先,你的字节转换为int:
int x = (int)byte_value;
然后,延伸到16位,通过在时移的位4,则如图2所示,然后如图1所示,然后用移和按位倍增每个比特OR:
x = ((x << 4) | x) & 0b0000111100001111;
x = ((x << 2) | x) & 0b0011001100110011;
x = ((x << 1) | x) & 0b0101010101010101;
x = (x << 1) | x;
然后,掩蔽的位,以使偶数位位置是1,如果该位为1,而奇数位置为1,如果该位为0(使用逐比特NOT):
x = (x & 0b0101010101010101) | (~x & 0b1010101010101010);
要小心:如果byte_value被签名为char,那么转换为int将执行符号扩展并可能填充除了低8位以外的所有符号。 –
你为什么用16位掩码屏蔽一个字节?你打算把你的字节实体转换成16位字吗? –
你意识到一个字节(通常是现在的日子)只有8位。你如何计划增加你的字节? –