剑指offer 二进制中1的个数

有两种方法
1 使用lowbit()函数,自定义 lowbit函数是计算出一个二进制数的最后一个1及其后面的0的大小,比如111100,那么lowbit就是返回100,相当于是求1的个数

class Solution {
public:
    int lowbit(int m) {
        return m & -m;
    }
    int NumberOf1(int n) {
        int res = 0;
        while (n) {
            res ++;
            n -= lowbit(n);
        }
        return res;
    }
};

2 输入的数据和1进行&,然后右移一位即可,注意要把int转化为无符号整数,因为如果是有符号整数,比如是负数的时候,二进制首位为1,当右移一位的时候,计算机会自动把符号位补全,所以永远也不会右移完全

class Solution {
public:
    int NumberOf1(int n) {
        unsigned int n1 = n;
        int res = 0;
        while (n1) {
            res += n1 & 1;
            n1 >>= 1;
        }
        return res;
    }
};

如果题目是直接输入的unsigned int ,那么lowbit代码如下

class Solution {
public:
    int lowbit(uint32_t m) {
        return m & (-m);
    }
    int hammingWeight(uint32_t n) {
        
        int res = 0;
        while (n) {
            res ++;
            n -= lowbit(n);
        }
        return res;
    }
};

右移的算法如下:

class Solution {
public:
    int hammingWeight(uint32_t n) {
        
        int res = 0;
        while (n) {
            res += (n & 1);
            n >>= 1;
        }
        return res;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值