如何倒数最后一个Y位并得到正数



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

x和y=2;二进制-10000中的16。去掉最后2位(z(,我们得到100。现在我需要反转最后两个零,所以结果将是十进制的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)

目标位与1之间的异或(XOR(运算将反转目标位;此外,您可以使用位掩码指定要翻转的位(在掩码中设置这些位(,对给定变量中的任何一组位(64-32位和16位int或字节(执行此操作-其他位(即掩码中有0的位(将保持不变。

您还可以使用位掩码和逐位AND运算符来清除任何特定的位;在这种情况下,与掩码中的1相对应的那些比特将保持不变,而与掩码中0相对应的比特将被清除

因此,可以通过将目标与值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(对于小的正数,单次左移通常等于2的乘积(,然后减去1:,可以将该值代入变量mask

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

然后,您可以使用mask来代替上述代码中3的"固定"值:

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

相关内容

最新更新