有没有一种从0增加到1的位技巧

Is there a bitwise trick to increase only zero to one?

本文关键字:增加 一种 有没有      更新时间:2023-10-16

在c++中,是否有可能使用按位技巧实现以下功能?

(i == 0) ? 1 : i

i为32位无符号整数

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

在我看到实际结果之前,我相信您的代码更清晰,速度也更快,但是这两种方法都可以在没有条件的情况下完成相同的事情:

i + !i

i | !i

i为0,则!i为1。通过加法或位或将0和1结合总是得到1。如果i不为0,则!i为0。通过加法或位或将非零值与0组合总是得到该值。因此,如果i为0,结果为1,否则为i

同样,如果这两种方法中的任何一种实际上对编译器更好,我会感到惊讶。

对于使用二进制补码表示负数的计算机,可以使用下面的公式:

(!(n & -2)) | n

演示。

说明:-2的位模式除最低有效位外所有位都为1。因此,表达式n & -2只有在n等于0或等于1时才为0。!将从0变为1,从任何其他数字变为0。因此,0或1将与1进行or -ed,而任何其他数字将保持不变。

相关文章: