二进制中1的个数-考虑负数

请实现一个函数,输入一个整数,输出该数二进制表示中 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;
     }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值