【问题标题】:How can I mask bits?如何屏蔽位?
【发布时间】:2017-07-02 00:32:18
【问题描述】:

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

例如:

00001111 -> 1010101001010101
00000101 -> 1010101010011001

这样做的操作是什么?

【问题讨论】:

  • 为什么要用 16 位掩码屏蔽一个字节?您是否打算将字节实体转换为 16 位字?
  • 您意识到一个字节(通常是现在)只有 8 位正确。您打算如何增加字节数?

标签: c binary bit-manipulation bit mask


【解决方案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,如果位为 0,奇数位为 1(使用按位非):

x = (x & 0b0101010101010101) | (~x & 0b1010101010101010);

【讨论】:

  • 注意:如果 byte_value 是有符号字符,则转换为 int 将执行符号扩展,并可能用 1 填充除低 8 位之外的所有位。
【解决方案2】:

我认为没有描述的“扩展”位的运算符。 但是您可以在循环中执行此操作,同时按如下方式移位和测试位:

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

希望对您有所帮助。

【讨论】:

  • 就是这样!谢谢
  • 不客气。如果它解决了您的问题,请不要忘记接受答案...
猜你喜欢
  • 2017-11-29
  • 1970-01-01
  • 2011-03-04
  • 2011-08-11
  • 2012-08-18
  • 1970-01-01
  • 1970-01-01
  • 2013-02-11
  • 1970-01-01
相关资源
最近更新 更多