我们都知道技巧n&(n-1)将最后1位设置为0.例如,0110& (0110-1)= 0100.但反过来怎么样?设置为0到1?所以0110变成了0111?
我已经在stackoverflow和在线进行了大量搜索。没有结果显示
答案 0 :(得分:5)
恰恰相反(好吧,不完全是你的意思):n | (n+1)
答案 1 :(得分:1)
要将最后一个零位设置为1,您可以向其添加一个,然后按位或自身添加
(x + 1) | x
答案 2 :(得分:0)
答案 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