有没有人有经验使用Bitwise Not来反转x数的特定位。我知道我们可以使用XOR和掩码,但问题需要使用NOT。
我需要从给定位置开始反转一组bis。函数内部的变量包括原始值,要开始的位置和宽度=我要反转的位数。
我使用移位位从给定位置开始但是如何使用NOT按位功能确保仅反转x位?
答案 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);
}