在C ++中,是否可以通过逐位技巧实现以下目标?
(i == 0) ? 1 : i
假设i
是无符号的32位整数。
答案 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
说明:-2的位模式在除最低位之外的所有位位置都有1位。因此,仅当n & -2
等于零或一时,表达式n
才为零。 !
将从零开始为零,从任何其他数字开始为零。因此,零或一个将与一个OR进行OR运算,而任何其他数字将保持不变。