如果我有一个x
类型的int
,如何获取x
的LSB的值并将数字中的所有其他位设置为该LSB? / p>
我一直在使用位运算符和逻辑运算符弄乱了一点(没有双关语),我知道它们的功能。
移位运算符x >> 3
和x << 3
分别将x的位向左和向右移位三个空间,我知道我们可以使用^
|
和{{ 1}}来操纵位。我在理解此特定问题的逻辑时遇到麻烦。
编辑:我们被允许用于此的运算符是! 〜&^ | + << >>
答案 0 :(得分:4)
从字面上来看:
type x /*=some value*/;
_Bool lsb = x&1;
x = lsb ? ~(type)0 : (type)0;
在2的补码体系结构上优化编译器使其无分支 等效于:
type x /*=some value*/;
_Bool lsb = x&1;
x = -lsb;
(或没有中间变量-(x&1)
的{{1}}。)
答案 1 :(得分:0)
如果(x&1){x = 4294967295}否则{x = 0}。 换句话说,如果x为奇数,则LSB为1,因此将x设置为最大可能的32位无符号整数(所有位均设置为1),否则,如果x为偶数,则LSB为零,因此将x设置为零。但是,等等,它是一个有符号整数,将所有位设置为1意味着有符号位被设置。因此将其更改为: if(x&1){x = -1} else {x = 0}。正如Eugene所说,然后可以只使用-(x&1)。
答案 2 :(得分:-2)
你们都假设-但最近我正在帮助检查学生和问题-找到LSB或LSB的值意味着数字中设置的最低位。使得任务变得不那么琐碎和明显是有意义的。
在这种情况下:
获取LSB的价值-z & (~z+1)
z = ~(z & (~z+1));