题目描述
输入一个整数,输出该数二进制表示中 1 的个数。
原码反码补码
可能是最通俗易懂的 Java 位操作运算讲解
解题思路
代码实现
会陷入死循环的解法
如果是负数,因为最高位一直是 1 ,所以会陷入死循环
public class Solution {
public int NumberOf1(int n) {
int count = 0;
while (n > 0) {
if ((n & 1) == 1) {
count ++;
}
n >>= 1;
}
return count;
}
}
改善
public int NumberOf1(int n) {
int count = 0;
// 需要右移32次
int x = 32;
while (x-- != 0) {
count += n & 1;
n >>= 1;
}
return count;
}
n&(n-1)
该位运算去除 n 的位级表示中最低的那一位。
n : 10110100
n-1 : 10110011
n&(n-1) : 10110000
时间复杂度:O(M),其中 M 表示 1 的个数。
public int NumberOf1(int n) {
int cnt = 0;
while (n != 0) {
cnt++;
n &= (n - 1);
}
return cnt;
}