使用按位NOT反转特定位

时间:2014-04-19 19:49:02

标签: c bit-manipulation invert

有没有人有经验使用Bitwise Not来反转x数的特定位。我知道我们可以使用XOR和掩码,但问题需要使用NOT。

我需要从给定位置开始反转一组bis。函数内部的变量包括原始值,要开始的位置和宽度=我要反转的位数。

我使用移位位从给定位置开始但是如何使用NOT按位功能确保仅反转x位?

3 个答案:

答案 0 :(得分:4)

xor的定义:a ^ b <--> (a & ~b) | (~a & b)

unsigned x = 0x0F;
unsigned mask = 0x44;  // Selected bits to invert

unsigned selected_x_bits_inverted = (x & ~mask) | (~x & mask);
printf("%02X\n", selected_x_bits_inverted);
// 4B

答案 1 :(得分:0)

方法是:

首先,将它们提取到y:

y = x & mask

然后,反转y并只得到你需要的位:

y = ~y & mask

清除从x:

中提取的位
x = x & (~mask)

或者那两个数字得到结果:

x = x | y

请注意,掩码中必须反转的每个位都是1。即使我使用其他按位运算符,实际的位翻转也是按位完成的。另外,如果不使用其他二元运算符,我认为不可能实现这个结果。

答案 2 :(得分:0)

此功能将反转宽度&#39;数字的位数&#39; num&#39;从位置&#39; pos&#39;

int invert(int num, int pos, int width)
{

  int mask = (~((~0) << width)) << pos;
  num = (~(num & mask)) & mask);

}