我有一个字节,它的二进制值是11111111。根据这些规则,我必须将我的字节扩展到16位0101010101010101 :如果位= 1,那么现在是01。如果位= 0,则现在是10。
例如:
00001111 -> 1010101001010101
00000101 -> 1010101010011001
执行此操作的操作是什么?
发布于 2017-02-13 21:56:20
首先,将您的字节转换为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,如果比特是0,则奇数位置为1(使用逐位NOT):
x = (x & 0b0101010101010101) | (~x & 0b1010101010101010);
发布于 2017-02-13 21:45:46
我不认为有一个运算符可以像描述的那样“扩展”比特。但是,您可以在循环中进行移位和测试,如下所示:
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;
}
希望能有所帮助。
https://stackoverflow.com/questions/42213947
复制相似问题