1. 本题知识点
位运算
2. 题目描述
输入一个整数,输出该数二进制表示中 1 的个数,其中负数用补码表示。
3. 解题思路
原码
最高位为符号位,正数该位为 0,负数该位为 1,其余位表示数值的大小。
例如:
+7 的原码:00000111
-7 的原码:10000111
反码
正数的反码与原码相同,负数的反码是其原码符号为不变,其余位取反。
例如:
+7 的反码:00000111
-7 的反码:11111000
补码
正数的补码与原码相同,负数的补码是其反码加一。
例如:
+7 的补码:00000111
-7 的补码:11111001
注意:计算机的数字运算均是基于补码
本题思路
使用 n&(n-1) 去除 n 最低位的 1,直到 n = 0
例如:
当 n = 100 时,
n = 01100100
n-1 = 01100011
n&(n-1) = 01100000
当 n = -100 时,
n = 10011100
n-1 = 10011011
n&(n-1) = 10011000
注意:这里只是为了方便理解,所以用的是 8 位来表示二进制数,但实际上 Java 的 int 类型有 32 位
4. 代码
public class Solution {
public int NumberOf1(int n) {
// 1 的个数
int count = 0;
while (n != 0) {
n &= (n - 1);
count++;
}
return count;
}
}