二进制中1的个数
问题简述
输入一个整数 n ,输出该数32位二进制表示中1的个数。其中负数用补码表示。思路1:利用x & 1和逻辑右移
按位统计 1 的个数
负数的处理:
C++/Java 中负数按补码形式存储;使用逻辑右移;
C++ 的逻辑右移:
x = (unsigned)x >> 1;Java 的逻辑右移:
x >>>= 1;
Python:先转成补码;
转补码:
x = n & 0xffffffff
C++
class Solution {
public:
int NumberOf1(int x) {
int cnt = 0;
while (x) {
if (x & 1) cnt += 1;
x = (unsigned)x >> 1; // C++ 中逻辑右移要先转无符号
}
return cnt;
}
};Java
public class Solution {
public int NumberOf1(int x) {
int cnt = 0;
while (x != 0) {
if ((x & 1) != 0) cnt += 1;
x >>>= 1; // Java 中的逻辑右移
}
return cnt;
}
}思路2:利用x & (x-1)
x & (x-1)每次将最右边的一个 1 转成 0;
Last updated