如何反转最后的 Y 位并得到正数?

How to inverse the last Y bits and get positive number?

在从右到左移除 Z 后,我需要从右到左反转 Y 位。

x 和 y = 2; 二进制 16 - 10000。删除最后 2 位 (z) 我们得到 100。现在我需要反转最后 2 个零,所以结果将是十进制的 3。你可以帮帮我吗?我不能只提取最后的 2(y) 来反转它们,然后将它们添加到剩余的一位。

int x = 16; // 10000
int y = 2;
int z= 2;
x = x>>z;
// x = 100
//inverse the last 2(y), 00 -> 11;
//print 3(11)

exclusive or (XOR) operation between a target bit and 1 will invert the target bit; furthermore, you can do this operation on any set of bits in a given variable (64- 32- and 16-bit int or byte) by using a bit mask 指定要翻转的位(在掩码中设置这些位)- 其他位(即掩码中带有 0 的位)将保持不变。

您还可以使用带有 bitwise AND operator 的位掩码来清除任何特定位;在这种情况下,对应于掩码中 1 的位将保持 不变 ,而对应于掩码中 0 的位将是 [=45] =]清除.

因此,可以通过将目标与值 3(在二进制中为 ...00011)进行异或来翻转最后两位;然后,您可以使用 & 运算符清除所有其他位(在这种情况下,掩码将相同)。

因此,此代码将执行您想要的操作:

int x = 16; // 10000
int y = 2;
int z= 2;
x = x >> z;// Shifts out (removes) the low 'z' bits
x = x ^ 3; // Flips the last two bits ("^" is the XOR operator)
x = x & 3; // Clears all BUT the last two bits

或者,更简洁:

x = ( (x >> z) ^ 3 ) & 3;

注意:如果你想将低 2 位更改为可变位数(即更改为 z,就像你对移位运算符所做的那样),然后您可以使用 2z - 1 将是该掩码的数值的知识来构造位掩码。您可以通过将数字 1 左移 z 来将此值放入变量 mask (单个左移 通常 等效乘以 2,对于小的 正数)然后减去 1:

int mask = (1 << z ) - 1;

那么可以用mask代替上面代码中3的'fixed'值:

x = ( (x >> z) ^ mask ) & mask;