在从右向左移除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;