一、题意
Write a function that takes an unsigned integer and returns the number of ’1’ bits it has (also known as the Hamming weight).
For example, the 32-bit integer ’11’ has binary representation 00000000000000000000000000001011, so the function should return 3.
二、分析和解答
其实就是把整数转换为二进制,然后查看它的一的位数。
1、十进制转换为二进制,通用版本是,取余 + 除2!!!
public int hammingWeight(int n) {
int count = 0;
while(n != 0){
int value = n % 2;
n = n / 2;
if(value == 0)
count++;
}
return count;
}
(Wrong Answer)2147483648 (10000000000000000000000000000000)输出值为0!越界的问题吗?这样不对!为什么不知道!
不过这样不是一个好方法,以后转换为二进制的方法或者这道题第一反应应该是位运算:左移、右移、异或、and、or。目前我对异或和&的运行机制还不太清楚,比如说这道题!!!
我判断异或的结果为1的竟然是错误的!
2、(TLE超时)
当我使用 >> 的时候,报错这个,我估计上面那个也是这种情况吧!
Last executed input:
2147483648 (10000000000000000000000000000000)
3、下面是正确的结果:
public int hammingWeight(int n) {
int count = 0;
while(n != 0){
int value = n & 1;
if(value == 1)
count++;
n = n >>> 1;
}
return count;
}
注意:除以2是右移一位。我开始写的时候写错了。>>>指的是无符号右移!
&:
1 & 1 = 1;
0 & 1 = 0;
1 & 0 = 0;
0 & 0 = 0;
4、更简单的一种方法:
public int hammingWeight(int n) {
int count = 0;
while(n != 0){
n = n & (n-1);
count++;
}
return count;
}
问题:
1、前两种方法错误的底层原因
2、& 和 ^ 的运算机制