我想计算unsigned char的逆掩码

时间:2011-11-04 01:49:28

标签: c bit-manipulation bitmask

如果原始掩码0xc0是反向掩码应该是0x3f,我想计算一个无符号char.meaning的反掩码。也就是说所有的位都应该被翻转或反转。我试过下面但是没有似乎工作正常。

int flipBit(int x, unsigned char position)
{
  int mask = 1 << position;
  return x ^ mask;
}

int main(int argc , char* argv[])
{
        uint8_t mask = 0x03;
        uint8_t inverse_mask = 0;
        uint8_t temp = 0;
        int loop = 0;

        for (loop = 0; loop < 8 ; loop ++)
        {
                temp = flipBit(mask,loop);
                inverse_mask |= temp;
        }
        printf("mask 0x%x inv mask 0x%x \n",mask,inverse_mask);
        return 0;
}

我得到的结果是 掩码0x3 inv掩码0xff

我似乎无法在我的代码中找到错误。

5 个答案:

答案 0 :(得分:6)

为什么你不能这样做:

uint8_t mask = 0x03;
uint8_t inverse_mask = ~mask;

答案 1 :(得分:6)

使用〜(按位非)运算符。

inverse_mask = ~mask;

答案 2 :(得分:1)

使用XOR非常简单。

uint8_t mask = 0x03;
uint8_t inverse_mask = mask ^ 0xFF;

答案 3 :(得分:1)

您的flipBit函数最多只能返回一位才能使代码正常工作:

0x03 ^ 0x01 = 0x02
0x03 ^ 0x02 = 0x01
0x03 ^ 0x04 = 0x07
0x03 ^ 0x08 = 0x0b
0x03 ^ 0x10 = 0x13
0x03 ^ 0x20 = 0x23
0x03 ^ 0x40 = 0x43
0x03 ^ 0x80 = 0x83
0x2 ^ 0x1 ^ 0x7 ^ 0xb ^ 0x13 ^ 0x23 ^ 0x43 ^ 0x83 = 0xff

int flipBit(uint8_t x, unsigned char position)
{
  int mask = 1 << position;
  return (x & mask) ^ mask;
}

答案 4 :(得分:1)

有很多方法可以做到。

假设你有这个二进制值:

x = 01110110

作为一个人,我们可以将其标识为“反向”:

y = 10001001

现在让我们看看它的属性:

  • y的每一位都不是x中相应位的位
    • 此操作在C中完成,如下所示:y = ~x;
    • 或者,我们知道一位xor 1不包含该位,因此y = x^0xFF;
  • 任何位加上它的总和不是1,没有进位。因此y+x == 0xFF
    • 因此,y = 0xFF-x;

至于为什么你的程序不起作用,让我们按照循环:

loop: 0
  mask:         0000 0011
  temp:         0000 0010
  inverse_mask: 0000 0010
loop: 1
  mask          0000 0011
  temp          0000 0001
  inverse_mask: 0000 0011
inverse_mask eventually: 0xFF

你可以在第一个循环中看到问题:你在inverse_mask的第二位有一个你不应该有的。

如果您希望temp仅保留被翻转的位,则应使用flibBit编写,而不是:

return x ^ mask;

这一行:

return (x & mask) ^ mask;

因此,您首先将该位隔离,然后将其翻转。

我解释过你在程序中学到了错误,你仍然应该使用我之前提到的方法之一。