检查整数内是否只设置了一个位(无论其位置如何)
我使用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 );