如何将最后一个(最低)0位设置为1

时间:2017-02-15 05:49:15

标签: algorithm bit-manipulation

我们都知道技巧n&(n-1)将最后1位设置为0.例如,0110& (0110-1)= 0100.但反过来怎么样?设置为0到1?所以0110变成了0111?

我已经在stackoverflow和在线进行了大量搜索。没有结果显示

5 个答案:

答案 0 :(得分:5)

恰恰相反(好吧,不完全是你的意思):n | (n+1)

答案 1 :(得分:1)

要将最后一个零位设置为1,您可以向其添加一个,然后按位或自身添加

(x + 1) | x

答案 2 :(得分:0)

要设置数字的k位,请执行以下操作

n=n|(1<< k)

其中k是您要设置的位。

我希望这会有所帮助。

对于其他位操作,您可以参考以下问题:Manipulation of bits

答案 3 :(得分:0)

对于那些像我一样正在寻找如何设置最低零位的人,这里有可能的解决方案:

((((x-1) ^ x) & x) >>> 1) | x

例如,数字 101100 的最低零位是第 3 位。

让我们分解设置最低位的过程:

  • 减去 1 和 XOR 得到掩码:(x-1) ^ x (101011 ^ 101100) = 000111

  • AND 掩码和数字以获得第一个非零位的位置:000111 & 101100 = 000100

  • 右移到最低的零位位置:000100 >>> 1 = 000010

  • OR 设置位:101100 | 000010 = 101110

更新:

替代的、稍微更有效的解决方案是:

(x & -x) >>> 1 | x,

其中 -x~(x-1) 的优化版本。

答案 4 :(得分:-1)

将最后一个(最低)0位设置为1:

FROM someTable WHERE MOD(someColumn,10)=1