是否有一个按位技巧只增加零到一个?

时间:2014-08-02 21:06:01

标签: c++ bit-manipulation

在C ++中,是否可以通过逐位技巧实现以下目标?

(i == 0) ? 1 : i

假设i是无符号的32位整数。

编辑:这是出于好奇。目标不是优化,也不是为了提高可读性。

2 个答案:

答案 0 :(得分:8)

直到我看到其他说法的真实结果,我相信你的代码更清晰,同样快,但是如果没有条件的话,其中任何一个都会完成同样的事情:

i + !i

或者

i | !i

如果i为0,则!i为1.将0与1相加或按位OR组合始终为1.如果i为非零,!i为0.通过加法或按位OR组合非零值和0总是给出该值。因此,如果i为0则结果为1,否则为i

同样,如果其中任何一个实际上对编译器更好,我会感到惊讶。

答案 1 :(得分:4)

在具有负数的二进制补码表示的计算机上,您可以使用以下公式:

(!(n & -2)) | n

Demo.

说明:-2的位模式在除最低位之外的所有位位置都有1位。因此,仅当n & -2等于零或一时,表达式n才为零。 !将从零开始为零,从任何其他数字开始为零。因此,零或一个将与一个OR进行OR运算,而任何其他数字将保持不变。