我有一个字节,其二进制值为11111111.我必须根据这些规则将我的字节扩展到16位0101010101010101:如果位= 1,则现在为01.如果位= 0,则现为10。
例如:
00001111 -> 1010101001010101
00000101 -> 1010101010011001
这样做的操作是什么?
答案 0 :(得分:1)
首先,将您的字节转换为int:
int x = (int)byte_value;
然后,通过一次移位4位,然后移位2,然后移位1,扩展到16位,然后用移位和按位加倍每个位OR:
x = ((x << 4) | x) & 0b0000111100001111;
x = ((x << 2) | x) & 0b0011001100110011;
x = ((x << 1) | x) & 0b0101010101010101;
x = (x << 1) | x;
然后,屏蔽这些位,使得如果该位为1则偶数位位置为1,如果该位为0则奇数位置为1(使用按位NOT):
x = (x & 0b0101010101010101) | (~x & 0b1010101010101010);
答案 1 :(得分:0)
我不认为有一个运营商可以扩展&#34;如上所述的位。 但是你可以在一个循环中与移位和测试位一起完成,如下所示:
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;
}
希望它有所帮助。