计算2进制1的个数

对2进制的数据 找到他的1的个数,我也是在网上看到的,讲计算机组成原理有类似的。蒙的一下 真是想不起来啊

真是越来越感觉大学计算机基础课的重要性了。

 描述是这样的,加入一个int型是2个字节(其实4个,就简单写了)

  假如有这么这个2进制数据  1101 1001,你应该怎么求他的那个1的个数呢。

按照咱们程序员来想,求8位的 ,那我就去求4位的,让哥求4位哥去求2位的,那么基本逻辑已经确定了。用递归的啦,程序员的基础了

 

 

慢慢来说

  怎么来求相邻2个的,为了 效率 我们用的是&,想想看 我们利用0101(ox 5) 和操作数 1010 进行&

      0  1  0  1
&    1  0  1  0

——————得到是什么呢? 看那个01 01 利用他们得到基数位的1个数 ,那么1010 左移一位 变成 0101

a:  0  0  0   0

 

       0 1 0  1

&     0 1  0 1

——————得到了偶数位的个数,那么a+b那么是相邻2个的1的个数,剩下的求4位,8位,什么的都好求了

 b: 0 1  0  1   

 

 

在这里粘贴网上的代码

 

 

private final long MASK_1 = 0x5555555555555555L;
    private final long MASK_2 = 0x3333333333333333L;
    private final long MASK_4 = 0x0F0F0F0F0F0F0F0FL;
    private final long MASK_8 = 0x00FF00FF00FF00FFL;
    private final long MASK_16 = 0x0000FFFF0000FFFFL;
    private final long MASK_32 = 0x00000000FFFFFFFFL;

Parallel Count 
    public int bitCount_Parallel(long n){
        n = (n & MASK_1) + ((n >>> 1) & MASK_1); 
        n = (n & MASK_2) + ((n >>> 2) & MASK_2); 
        n = (n & MASK_4) + ((n >>> 4) & MASK_4); 
        n = (n & MASK_8) + ((n >>> 8) & MASK_8); 
        n = (n & MASK_16) + ((n >>> 16) & MASK_16); 
        n = (n & MASK_32) + ((n >>> 32) & MASK_32); 
        return (int)n;
    }

 

我想这里好理解多了把,基本原理是个递归,编程序吗 思路很重要的啦。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值