题目:输入一个32位整数,输出该数二进制表示中1的个数。
注意:负数在计算机中用其绝对值的补码来表示。
求补码的方法:
- 例如求-8的补码
- 1.先求出-8的绝对值:8
- 2.写出8的二进制表示:1000
- 3.从右往左,碰到第一个1之后,剩下的位全部取反,32位操作系统中-8的表示就是:1111 1111 1111 1111 1111 1111 1111 1000
位运算:
- 1111 & 1 = 1 拿1111的最后一位与1做与运算 所以结果为
其他补充:
- C++中如果一个有符号的整数做位运算,例如向右移动1位,那么它会在最高位上补1。如果一个无符号整数做位运算,那么它会在最高位上补0。
- 例如 (有符号整数)
0000 0000 0000 0000 0000 0000 0000 0001 >> 1 =
1000 0000 0000 0000 0000 0000 0000 0000 - (无符号整数)
1000 0000 0000 0000 0000 0000 0000 0001 >> 1 =
0100 0000 0000 0000 0000 0000 0000 0000
根据以上信息,本题思路,先把有符号整数转换成无符号整数,不然会产生死循环,然后与1做&运算,统计个数。
class Solution {
public:
int NumberOf1(int n) {
unsigned int _n = n;
int count = 0;
while (_n)
{
if (_n & 1 == 1) count += 1;
_n >>= 1;
}
return count;
}
};
网友评论