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

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

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

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

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

  • (8051)检查是否设置了一个位
  • 检测整数内的单个一位流

以及一些维基百科页面:

  • 找到第一个
  • 位操作
  • 汉明重量

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


编辑 : LưuVĩnhPhúc指出我的问题中的第一个链接已经得到了答案:请参阅确定一个整数是否在Bit Twiddling Hacks (Sean Eron Anderson)中的2的 。 我没有意识到单个位 与2的幂相同。

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

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

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

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

(使用x作为参数)

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

 return x!=0; 

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

 return (x&2)!=0; 

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

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

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

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

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

假设你已经有了ffs()的高效或硬件实现 – 找到第一组 – 你可以按如下方式行事:

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

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

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

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

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

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

或者从右边检查第4位

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