对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;
}
我想这里好理解多了把,基本原理是个递归,编程序吗 思路很重要的啦。