计算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;
    }

 

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

你可能感兴趣的:(计算)