题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
一、原码、反码、补码
1、原码
在数值前直接加一符号位的表示法:
一个字节表示(8位二进制),7和-7
-
7:0000 0111
-
-7:1000 01111
-
无符号位取值范围: 0 ∽ 2 8 − 1 0 \backsim 2^8-1 0∽28−1
-
有符号位取值范围: − 2 7 ∽ 2 7 − 1 -2^7 \backsim 2^7-1 −27∽27−1
2、反码
正数:正数的反码与原码相同。负数:负数的反码,符号位为“1”,数值部分按位取反
- 7的反码:0000 0111
- -7的反码:1111 1000
3、补码
正数:正数的补码和原码相同
负数:负数的反码+1
- 7的补码:0000 0111
- -7的补码:1111 1001
计算机中使用补码来计算
二、解题思路
一个整数减去1,就是从右边起第一个1变成0。如果它的右边还有0,则所有的0都变成1,而它左边的所有位都保持不变,然后我们用该整数和它减去1的结果做与运算,相当于把它右边的1变为0。
执行完上述操作一次后,count加1;然后再用 1000 作为原整数,重复以上操作,直到与运算结果为0
三、Java
代码
public class Solution {
public int NumberOf1(int n) {
int count = 0;
while(n != 0){
count++;
n &= (n - 1);
}
return count;
}
}
四、C++
代码
class Solution {
public:
int NumberOf1(int n) {
int count = 0;
while(n != 0){
count++;
n &= (n - 1);
}
return count;
}
};
五、Python3
代码
# -*- coding:utf-8 -*-
class Solution:
def NumberOf1(self, n):
# write code here
count = 0
if n < 0:
n = n & 0xffffffff # 获取负数的补码
while n != 0:
count += 1
n = (n - 1) & n
return count