除前导零之外的整数零位数

时间:2010-06-20 15:34:38

标签: java algorithm bit-manipulation

如果我在Java中有一个整数,除了前导零之外,我如何计算有多少位为零?

我们知道Java中的整数有32位,但计算数字中的设置位数,然后从32减去不能得到我想要的东西,因为这也包括前导零。

例如,数字5有一个零位,因为在二进制中它是101

6 个答案:

答案 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 ++中尝试相同的东西,编译器可以通过设置你的打印机来使你看起来很愚蠢。