将所有位设置为最低有效位

时间:2019-01-29 21:24:47

标签: c binary bit-manipulation

如果我有一个x类型的int,如何获取x的LSB的值并将数字中的所有其他位设置为该LSB? / p>

我一直在使用位运算符和逻辑运算符弄乱了一点(没有双关语),我知道它们的功能。

移位运算符x >> 3x << 3分别将x的位向左和向右移位三个空间,我知道我们可以使用^ |和{{ 1}}来操纵位。我在理解此特定问题的逻辑时遇到麻烦。

编辑:我们被允许用于此的运算符是! 〜&^ | + << >>

3 个答案:

答案 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}}。)

https://gcc.godbolt.org/z/2NXFpS

答案 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));