我使用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撰写)。我没有意识到 一个位 与 两个 的功能相同。
答案 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 );