【剑指offer】面试题15:二进制中1的个数——附负数的二进制表示

在这里插入图片描述

方法一:利用10进制转换成2进制的步骤

将输入的数依次对2求余,记录结果,再讲输入的数除以2,
最后结果从下往上依次就是2进制的结果
只需要记录当求余等于1的时候的个数

class Solution {
public:
    int hammingWeight(uint32_t n) {
        if( n == 0 )
            return 0;
        int count = 0;
        while( n != 0 )
        {
            
            if(n % 2 == 1)
                count++;
            n = n >> 1;
        }
        return count;
    }
};

方法二:将这个数不断右移一位一位的去判断

class Solution {
public:
    int hammingWeight(uint32_t n) {
        if( n == 0 )
            return 0;
        int count = 0;
        while( n != 0 )
        {
            if( n & 1)
                count++;
                
            n = n >> 1;
        }
        return count;
    }
};

但是如果这种情况我们输入一个负数的时候因为负数的二进制最高位都是1,所以如果不断的左移的话,我们的负数最高位最后始终都要置位1,可造成这个数变成0xffffffff而陷入死循环。
因此我们可以不对这个数进行操作,而是同一个一个flag位,从最低位不断的移动,移动到高位去和这个数的每一位进行与操作进行判断。
因此有方法三:

方法三:不改变这个数,通过一个flag左移进行判断

ps:1<< 32 结果是0
所以此循环会运行32次。

class Solution {
public:
    int hammingWeight(uint32_t n) {
        if( n == 0 )
            return 0;
        int count = 0;
        uint32_t flag =1 ;
        while( flag )
        {
            if( n & flag)
                count++;
                
            flag = flag << 1;
        }
        return count;
    }
};

方法四:每次消去最右边的1,直到消完为止

class Solution {
public:
    int hammingWeight(uint32_t n) {
        if( n == 0 )
            return 0;
        int count = 0;

        while( n )
        {
            count++;
            n = (n -1) & n;  
        }
        return count;
    }
};

负数的二进制表示

在计算机中,
正数是直接用原码表示的,如单字节5,在计算机中就表示为:0000 0101。
负数以其正值的补码形式表示,如单字节-5,在计算机中表示为1111 1011。

所以正数与负数的转换只需要在原来正数的原码基础上取反得到反码再+1得到补码就是我们的负数的二进制

int tonNegative(int num)
{
    return (~num) + 1;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值