如果我在Java中有一个整数,除了前导零之外,我如何计算有多少位为零?
我们知道Java中的整数有32位,但计算数字中的设置位数,然后从32减去不能得到我想要的东西,因为这也包括前导零。
例如,数字5有一个零位,因为在二进制中它是101
。
答案 0 :(得分:6)
查看Integer的API文档:
32 - Integer.numberOfLeadingZeros(n) - Integer.bitCount(n)
答案 1 :(得分:3)
要计算Java中的非前导零,您可以使用此算法:
public static int countNonleadingZeroBits(int i)
{
int result = 0;
while (i != 0)
{
if (i & 1 == 0)
{
result += 1;
}
i >>>= 1;
}
return result;
}
如果您的输入通常较小,则此算法将相当快,但如果您的输入通常较大,则在this page上使用其中一个位攻击算法的变体可能会更快。
答案 2 :(得分:1)
计算数字中“位”的总数,然后从总位数中减去1位数。
答案 3 :(得分:1)
这就是我要做的。
public static int countBitsSet(int num) {
int count = num & 1; // start with the first bit.
while((num >>>= 1) != 0) // shift the bits and check there are some left.
count += num & 1; // count the next bit if its there.
return count;
}
public static int countBitsNotSet(int num) {
return 32 - countBitsSet(num);
}
答案 4 :(得分:0)
使用一些内置函数:
public static int zeroBits(int i)
{
if (i == 0) {
return 0;
}
else {
int highestBit = (int) (Math.log10(Integer.highestOneBit(i)) /
Math.log10(2)) + 1;
return highestBit - Integer.bitCount(i);
}
}
答案 5 :(得分:-2)
由于Java中的评估顺序为defined,我们可以这样做:
public static int countZero(int n) {
for (int i=1,t=0 ;; i<<=1) {
if (n==0) return t;
if (n==(n&=~i)) t++;
}
}
请注意,此依赖在LHS上首先评估相等性;在C或C ++中尝试相同的东西,编译器可以通过设置你的打印机来使你看起来很愚蠢。