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

时间:2012-11-16 16:10:01

标签: java binary bit-manipulation bit bitwise-operators

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

boolean isOneSingleBitSet (long integer64)
{
   return ....;
}

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

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

以及一些维基百科页面:

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


编辑Lưu Vĩnh Phúc指出我的问题中的第一个链接已经得到了答案:请参阅 Bit Twiddling Hacks 中的Determining if an integer is a power of 2部分(由Sean Eron Anderson撰写)。我没有意识到 一个位 两个 的功能相同。

6 个答案:

答案 0 :(得分:17)

如果您只是想确定是否设置了一个位,那么您基本上是在检查该数字是否为2的幂。为此,您可以这样做:

if ((number & (number-1)) == 0) ...

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

if (number != 0 && (number & (number-1)) == 0) ...

答案 1 :(得分:15)

(使用x作为参数)

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

return x!=0;

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

return (x&2)!=0;

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

return x!=0 && (x & (x-1))==0;

答案 2 :(得分:3)

包装类java.lang.Long有一个静态函数bitCount(),它返回long(64位int)中的位数:

boolean isSingleBitSet(long l)
{
     return Long.bitCount(l) == 1;
}

请注意,java中的int是32位。

答案 3 :(得分:1)

假设您已经有{ - 1}}的高效或硬件实施 - 找到第一套 - 您可以采取以下措施:

ffs()

bool isOneSingleBitSet (long integer64) { return (integer64 >> ffs(integer64)) == 0; } 功能可能已经可用,或者您可能希望看到your own link above

答案 4 :(得分:1)

假设X是一个64位的满0,除了你正在寻找的那个;

  return ((64bitinteger&X)==X)

答案 5 :(得分:0)

看起来你可以做一个按位AND并且你要检查的单个位的long表示。例如,检查LSB

return(   (integer64 & 1L)!=0  );

或者检查右边的第4位

return(   (integer64 & 8L)!=0  );