这是leetcode(https://leetcode.com/problems/number-of-1-bits/)的一个问题。此方法用于计算这个数字在二进制中的1s。我尝试使用n=n/2,它不是通过所有的情况,而n=n>>1则是这样。有人知道为什么吗?
public class Numberof1Bits {
public static void main(String[] args) {
System.out.println(new Numberof1Bits()
.hammingWeight(0b11111111111111111111111111111111));
}
public int hammingWeight(int n) {
int count = 0;
if (n < 0)
count++;
for (int i = 0; i < 31; i++) {
if ((n & 1) == 1)
count++;
n = n >> 1;// while this doesn't work when n=n/2;
}
return count;
}
}发布于 2015-04-19 01:15:45
你在使用未签名的ints。0xFFFFFFFF = -1-1 >> 1= -1。-1/2 = 0。对于任何具有最重要位集的数字,它都会失败。
如果是Java,则>>运算符执行符号扩展的按位右移.例如(为了清晰起见,我使用8位数字):
0b10111111 >> 1 => 0b11011111同样的小数:
-65 >> 1 => -33位被右移一个位置,最重要的位保持原样。我的示例数字(0b10111111)是-65小数点。如果你把它除以2,你就得到-32。是的,我们在翻译中损失了一点。/2执行算术除法,对于正数,它等价于>> 1 only。
在支持无符号In和无符号右移的语言中,n/2应按预期工作。
在java中,由于>>是签名的,所以可以使用没有符号扩展的右移位的>>>,并可能使用更快的循环:
public int hammingWeight(int n) {
int count = 0;
while(n != 0) {
if ((n & 1) != 0) {
count++;
}
n = n >>> 1;
}
return count;
}发布于 2015-04-19 01:59:45
>> 1将一个int除以二,但舍入是使用地板完成的,即向负无穷远舍入。相关的引用来自Java语言规范:
N个>> s的值是n个右移的s位位置,具有符号扩展.其结果值为下限(n/ 2^s)。
例如,
20 >> 1 == 10
15 >> 1 == 7 (7.5 is rounded down to 7)
-20 >> 1 == -10
-15 >> 1 == -8 (-7.5 is rounded down to -8) 另一方面,对于/,舍入是向零方向进行的。这来自Java语言规范:
二进制/运算符执行除法,产生其操作数的商。左操作数是除数,右边操作数是除数. 整数除法转到0。
例如,
20 / 2 == 10
15 / 2 == 7 (7.5 is rounded down to 7)
-20 / 2 == -10
-15 / 2 == -7 (-7.5 is rounded UP to -7)因此,对于负奇数整数n,n /= 2与n >>= 1; n++;相同。n++将完全更改设置位数的计算。
https://stackoverflow.com/questions/29724699
复制相似问题