8

我使用 64 位整数中的位存储标志。
我想知道在 64 位整数中的任何位置是否都设置了一个位(我不关心任何特定位的位置)。

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 in the Bit Twiddling Hacks(Sean Eron Anderson)部分。我没有意识到一位与二的相同。

4

6 回答 6

23

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

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

这也将 0 视为 2 的幂,因此如果这很重要,您应该检查数字是否不是 0。那么:

if (number != 0 && (number & (number-1)) == 0) ...
于 2012-11-16T16:18:24.517 回答
16

(使用 x 作为参数)

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

return x!=0;

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

return (x&2)!=0;

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

return x!=0 && (x & (x-1))==0;
于 2012-11-16T16:21:18.450 回答
3

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

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

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

于 2012-11-16T16:18:03.753 回答
2

让我们假设 X 是一个 64 位的中间,除了你正在寻找的那个之外,它充满了 0;

  return ((64bitinteger&X)==X)
于 2012-11-16T16:20:14.070 回答
1

假设您已经有一个高效的 - 或硬件 - 实现ffs()- find first set - 您可以执行以下操作:

bool isOneSingleBitSet (long integer64)
{
   return (integer64 >> ffs(integer64)) == 0;
}

ffs()功能可能已经可用,或者您可能希望在上面查看您自己的链接

于 2012-11-16T16:17:02.367 回答
0

似乎您可以对long要检查的单个位的表示进行按位与运算。例如,检查 LSB

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

或者检查右边的第 4 位

return(   (integer64 & 8L)!=0  );
于 2012-11-16T16:18:46.670 回答