检查整数内是否只设置了一个位(无论其位置如何)

oli*_*bre 7 java binary bit-manipulation bit bitwise-operators

我使用64位整数内的位存储标志.
我想知道是否有一个位设置无论64位整数内的位置(ei我不关心任何特定位的位置).

boolean isOneSingleBitSet (long integer64)
{
   return ....;
}
Run Code Online (Sandbox Code Playgroud)

我可以使用Bit Twiddling Hacks(Sean Eron Anderson)计算位数,但我想知道检测单个位是否设置的最有效方法是什么...

我发现了一些其他相关的问题:

以及一些维基百科页面:

注意:我的应用程序是在java中,但我很好奇使用其他语言的优化...


编辑:琉永福指出我的问题在我的第一个链接已经得到了答案:请参见如果一个整数是2的幂确定位操作黑客(肖恩·安德森玉龙).我没有意识到单个位与2的幂相同.

Nei*_*fey 18

如果您只是想确定是否设置了一个位,那么您实际上是在检查该数字是否为2的幂.为此,您可以执行以下操作:

if ((number & (number-1)) == 0) ...
Run Code Online (Sandbox Code Playgroud)

这也将0作为2的幂,因此如果重要的话,你应该检查不是0的数字.那么:

if (number != 0 && (number & (number-1)) == 0) ...
Run Code Online (Sandbox Code Playgroud)

  • 好吧,虽然我口头上说你需要做零检查:你是否真的无法把它变成代码? (3认同)

Joh*_*rak 16

(使用x作为参数)

检测是否设置了至少一位很容易:

return x!=0;
Run Code Online (Sandbox Code Playgroud)

同样检测是否设置了第一位(第二低位)很容易:

return (x&2)!=0;
Run Code Online (Sandbox Code Playgroud)

如果它是2的幂,则设置正好一位.这有效:

return x!=0 && (x & (x-1))==0;
Run Code Online (Sandbox Code Playgroud)