请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。
计算机中二进制是以补码的形式存储的,注意第一位最高位是符号位,正的为0,负的为1。如果是正的,补码就是原码,基本不用考虑额外的情况;如果是负的,要以补码的形式,首先把原码取反,再加1就得到补码!!!!切记不要拿着原码就来运算。计算机就是以补码存储的。比如-5,原码是1000 0101,取反:1111 1010 (最高位不变)补码是1111 1011,1的个数是7个!(位是计算机中数据存储的最小单位,8 bit 就称为一个字节(Byte))
而5的二进制中1的二个数是2个。
C语言提供了 short、int、long、long long 四种类型的整数,它们的长度依次递增。
而 Python 则不同,它的整数不分类型,或者说它只有一种类型的整数。Python 整数的取值范围是无限的,不管多大或者多小的数字,Python 都能轻松处理。
解法1:只能针对正的:
class Solution(object):
def hammingWeight(self, n):
a = 0
while n != 0:
if n & 1 == 1:
a += 1
n = n >> 1
return a
解法2:左移,因为负数的移动比较坑爹,最高位一直补1.无论什么负数,不断左移,最终是-1.(1111 1111).所以我们移动比较的:
设置32的原因是python不比C++,他的符号位不是第0位。
// 注意-1是 111111111111负数的补码等于反码+1,
// 反码就是原码除了符号位之外取反。
//正数的原码,补码,反码 相同, 正数用原码表示,负数用补码表示,
//负数用如果也用原码表示,表示范围就只有255个数 -128无法表示.
// 如果只有八位的话,那么就只能表示 -127 到 128
class Solution:
def NumberOf1(self, n):
a = 1
out = 0
num = 0
while num < 32:
if n & a:
out += 1
a = a << 1
num += 1
return out```
```python
class Solution {
public:
int NumberOf1(int n) {
int num = 1;
int out = 0;
while(num){
if(num & n){
out += 1;
}
num = num << 1;
}
return out;
}
};