#Lucene# org.apache.lucene.util.BitUtil.pop(long x) 札记
#Lucene# org.apache.lucene.util.BitUtil.pop(long x) 笔记今天读 Lucene 源码,有这样一个函数: 之后x0
#Lucene# org.apache.lucene.util.BitUtil.pop(long x) 笔记
今天读 Lucene 源码,有这样一个函数:
; 之后
x=0x08101010
再经过x = x + (x >>> 16);之后
x=0x08101820
最后return x & 0x0000003F;
result=0x00000020
可以看到结果是正确的。
具体的原因就是因为32位整数,所有1的个数加起来不会超过0x3F,而64位中1的个数不会超过0x7F,也就是结果最多不过7位。
到移动8位的时候,结果已经聚集到低位来了,高位的结果不会对低位造成影响,所以不用再做额外的与运算。