如何计算二进制中的零的数目?

4dbbbstv  于 2021-07-06  发布在  Java
关注(0)|答案(7)|浏览(563)

嗨,我正在做一个方法,可以把一个整数作为一个参数,并计算它的二进制形式有多少个零。例如,如果我有二进制零(44),它的二进制形式是101100。因此,二进制零(44)应该返回3。然而,我犯了一些错误,我不知道这是从哪里来的。如果有人能指出我犯的错误,或者我解决这个问题的方法(逻辑)足够好,我将不胜感激。谢谢您!我的代码如下:

public static int binaryZeros(int n) {
int zeroCount = 0;
double m = n;
while (m >= 0.0) {
    m = m / 2.0;
    if (m == Math.floor(m)) {
        zeroCount++;
    } else {
        m = Math.floor(m);
    }
}
return zeroCount;
}
dnph8jn4

dnph8jn41#

这里有一个方法。它只是对1和0的整数进行补码,然后对1位进行计数。这样做时不应该使用浮点数学。 ~ 补位 &1 屏蔽低位。为1或0 >>> 右移1位,包括符号位。

System.out.println(binaryZeros(44) + " (" +Integer.toBinaryString(44) +")"); 
System.out.println(binaryZeros(-44) + " ("Integer.toBinaryString(-44)+")");

public static int binaryZeros(int v) {
    int count = 0;
    while (v != 0) {
        // count 1 bits 
        // of ~v
        count += (~v)&1;
        v >>>=1;
    }
    return count;
}

印刷品

3 (101100)
4 (11111111111111111111111111010100)
pkwftd7m

pkwftd7m2#

简单一点,如果有 Integer.bitCount(n) 方法:

public static int binaryZeros(int n) {
    long val = n & 0xFFFFFFFFL;
    int totalBits = (int)(Math.log(val) / Math.log(2) + 1);
    int setBits = Long.bitCount(val);
    return totalBits - setBits;
}
gopyfrb3

gopyfrb33#

你的方法很好,但我认为还有更好的方法。integer类有一个静态方法,返回数字的二进制: Integer.toBinaryString(num) . 这将返回一个字符串。然后,您可以使用具有for循环并使用if进行求值的方法检查该字符串中是否有0:

public int getZeros(String binaryString){
int zeros = 0;
for(int i=0; i < binaryString.length; i++)
      if(binaryString.charAt[i].equals('0')
           zeros++;
return zeros;
}

我相信这将是一个更简单的选择,它没有任何错误。

ekqde3dh

ekqde3dh4#

如果你从一个m>=0的数字开始,它永远不会变成负数,不管你用2除以多少次或者用math.floor。循环应该在m达到0时停止,因此将条件更改为 while (m > 0.0) .
请注意,可以使用内置的标准库方法执行相同的操作。例如,有一个方法返回一个数中前导零的个数,还有一个方法返回设置为1的位数。使用这两种方法,可以计算非前导零的零数:

static int binaryZeros(int n) {
    return Integer.SIZE - Integer.numberOfLeadingZeros(n) - Integer.bitCount(n);
}
lc8prwob

lc8prwob5#

public static int getZeros(int num) {
        String str= Integer.toBinaryString(num);
        int count=0;
        for(int i=0; i<str.length(); i++) {
            if(str.charAt(i)=='0') count++;
        }
        return count;
    }

方法tobinarystring()返回整数参数的字符串表示形式,该字符串表示形式为基数为2的无符号整数。它接受int数据类型的参数并返回相应的二进制字符串。然后for循环计算字符串中的零数并返回它。

l7wslrjt

l7wslrjt6#

下面是一个更简洁的方法来解决这个问题

public static int binaryZeros(int n) {
    int zeroCount = 0;

    // Run a while loop until n is greater than or equals to 1
    while(n >= 1)
    {
        /* Use modulo operator to get the reminder of division by 2 (reminder will be 1 or 0 as you are dividing by 2). 
           Keep in mind that binary representation is an array of these reminders until the number is equal to 1. 
           And once the number is equal to 1 the reminder is 1, so you can exit the loop there.*/ 
        if(n % 2 == 0)
        {
            zeroCount++;
        }

        n = n / 2;
    }
    return zeroCount;
}
bxfogqkk

bxfogqkk7#

一次 m == 0.0 ,它永远不会改变,所以你的 while 循环永远不会停止。

相关问题