嗨,我正在做一个方法,可以把一个整数作为一个参数,并计算它的二进制形式有多少个零。例如,如果我有二进制零(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;
}
7条答案
按热度按时间dnph8jn41#
这里有一个方法。它只是对1和0的整数进行补码,然后对1位进行计数。这样做时不应该使用浮点数学。
~
补位&1
屏蔽低位。为1或0>>>
右移1位,包括符号位。印刷品
pkwftd7m2#
简单一点,如果有
Integer.bitCount(n)
方法:gopyfrb33#
你的方法很好,但我认为还有更好的方法。integer类有一个静态方法,返回数字的二进制:
Integer.toBinaryString(num)
. 这将返回一个字符串。然后,您可以使用具有for循环并使用if进行求值的方法检查该字符串中是否有0:我相信这将是一个更简单的选择,它没有任何错误。
ekqde3dh4#
如果你从一个m>=0的数字开始,它永远不会变成负数,不管你用2除以多少次或者用math.floor。循环应该在m达到0时停止,因此将条件更改为
while (m > 0.0)
.请注意,可以使用内置的标准库方法执行相同的操作。例如,有一个方法返回一个数中前导零的个数,还有一个方法返回设置为1的位数。使用这两种方法,可以计算非前导零的零数:
lc8prwob5#
方法tobinarystring()返回整数参数的字符串表示形式,该字符串表示形式为基数为2的无符号整数。它接受int数据类型的参数并返回相应的二进制字符串。然后for循环计算字符串中的零数并返回它。
l7wslrjt6#
下面是一个更简洁的方法来解决这个问题
bxfogqkk7#
一次
m == 0.0
,它永远不会改变,所以你的while
循环永远不会停止。