如果原始掩码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
我似乎无法在我的代码中找到错误。
答案 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
中相应位的位
y = ~x;
y = x^0xFF;
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;
因此,您首先将该位隔离,然后将其翻转。
我解释过你在程序中学到了错误,你仍然应该使用我之前提到的方法之一。