jdk的Integer.java中的一个方法,实在看不懂,怎么移位就算出了一个数字的二进制原码中有几个1,那位大牛能通俗的解释下下面这段代码?
/** * Returns the number of one-bits in the two's complement binary * representation of the specified <tt>int</tt> value. This function is * sometimes referred to as the <i>population count</i>. * * @return the number of one-bits in the two's complement binary * representation of the specified <tt>int</tt> value. * @since 1.5 */ public static int bitCount(int i) { // HD, Figure 5-2 i = i - ((i >>> 1) & 0x55555555); i = (i & 0x33333333) + ((i >>> 2) & 0x33333333); i = (i + (i >>> 4)) & 0x0f0f0f0f; i = i + (i >>> 8); i = i + (i >>> 16); return i & 0x3f; }
可以参考这个:
[url]http://15838341661-139-com.iteye.com/blog/1642525[/url]
二分法,两两一组相加,之后四个四个一组相加,接着八个八个,最后就得到各位之和了。
第一行是计算每两位中的 1 的个数 , 并且用该对应的两位来存储这个个数 ,
如 : 01101100 -> 01011000 , 即先把前者每两位分段 01 10 11 00 , 分别有 1 1 2 0 个 1, 用两位二进制数表示为 01 01 10 00, 合起来为 01011000.
第二行是计算每四位中的 1 的个数 , 并且用该对应的四位来存储这个个数 .
如 : 01101100 经过第一行计算后得 01011000 , 然后把 01011000 每四位分段成 0101 1000 , 段内移位相加 : 前段 01+01 =10 , 后段 10+00=10, 分别用四位二进制数表示为 0010 0010, 合起来为 00100010 .
下面的各行以此类推 , 分别计算每 8 位 ,16 位 ,32 位中的 1 的个数 .
将 0x55555555, 0x33333333, 0x0f0f0f0f 写成二进制数的形式就容易明白了 .
看这个
java 逐位运算符
逐位或运算符(|),右移运算符(>>)非运算符(~) ,用0补足的右移运算符(>>>)
.....
[url]http://demojava.iteye.com/blog/1367827[/url]
这个太简单了,一般人都看不懂...
这个方法的意思是
给定一个int类型数据,返回这个数据的二进制串中“1”的总数量