我该如何屏蔽位?

时间:2017-02-13 21:32:22

标签: c binary bit-manipulation bit mask

我有一个字节,其二进制值为11111111.我必须根据这些规则将我的字节扩展到16位0101010101010101:如果位= 1,则现在为01.如果位= 0,则现为10。

例如:

00001111 -> 1010101001010101
00000101 -> 1010101010011001

这样做的操作是什么?

2 个答案:

答案 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;
}

希望它有所帮助。