位运算 - 14.二进制中1的个数

在这里插入图片描述
思路1,Java中有带符号右移,我们只要判断最后一位是否为1,进行统计即可。判断方法就是和 1 做与运算。

 public int NumberOf1(int n) {
        int count = 0;
        while(n!=0){
            count += n & 1;
            n = n >>>1;
        }
        return count;
    }

思路2:我把把1左移与原数字做与运算。这样我们就不用移动原数子了。只要判断当前的与结果是否不为0即可。但是缺点也很明显,32位全部都要判断。

 public int NumberOf2(int n) {
        int count = 0;
        int falge = 1 ;
        for(int i = 0 ; i < 32 ; i++){
           if(falge== (n & falge)){
               count++;
           }
           falge = falge << 1;
        }
        return count;
    }

思路3:n 和 n-1 做与运算并赋值给n,只要当前 n 不等于0,那么我们就接着和 n-1 做与运算,直到 n 等于 0 为止,统计与操作的次数即可。

讲解一下这个原理,例如12,也就是1100,11的二进制为 1011
1100 & 1011 = 1000;1次
1000 & 0111 = 0000;2次;

例如31二进制为1111,30的二进制为1110;
1111 & 1110 = 1110;1次
1110 & 1101 = 1100;2次
1100 & 1011 = 1000;3次
1000 & 0111 = 0000;4次;
我们会发现只要n的二进制中有几个1,它就会做几次与运算,直到与运算的结果为0;

 public int NumberOf1(int n) {
        int count = 0;
       while(n!=0){
           n &= n-1;
           count++;
       }
       return count;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值