`

#Lucene# org.apache.lucene.util.BitUtil.pop(long x) 笔记

    博客分类:
  • java
阅读更多

今天读 Lucene 源码,有这样一个函数:

/** Returns the number of bits set in the long */
	public static int pop(long x) {
		/*
		 * Hacker's Delight 32 bit pop function:
		 * http://www.hackersdelight.org/HDcode/newCode/pop_arrayHS.cc
		 * 
		 * int pop(unsigned x) { x = x - ((x >> 1) & 0x55555555); x = (x &
		 * 0x33333333) + ((x >> 2) & 0x33333333); x = (x + (x >> 4)) &
		 * 0x0F0F0F0F; x = x + (x >> 8); x = x + (x >> 16); return x &
		 * 0x0000003F; }*
		 */

		// 64 bit java version of the C function from above
		x = x - ((x >>> 1) & 0x5555555555555555L);
		x = (x & 0x3333333333333333L) + ((x >>> 2) & 0x3333333333333333L);
		x = (x + (x >>> 4)) & 0x0F0F0F0F0F0F0F0FL;
		x = x + (x >>> 8);
		x = x + (x >>> 16);
		x = x + (x >>> 32);
		return ((int) x) & 0x7F;
	}

 

这一长串代码读得晕晕乎乎,李今 同学 share 了一个链接 说明这段代码。这个函数与 java.lang.Long 中的 bitCount 函数一模一样 -.- 这段代码的原作者实在太有才了,这么几行代码就大肆发挥了一下:

x = x - ((x >>> 1) & 0x5555555555555555L);
//上面这句与下面这句的意思是一样的:
x = (x &  0x5555555555555555L) + ((x >>> 1) & 0x5555555555555555L)

x = (x + (x >>> 4)) & 0x0F0F0F0F0F0F0F0FL;
//上面这句的意思也跟下面这个一样:
x = (x & 0x0F0F0F0F0F0F0F0FL) + ( (x >>> 4) & 0x0F0F0F0F0F0F0F0FL);

 

这段代码的目的就是求二进制数中 1 的个数,该作者用三个写法写了一个意思……

 

这段代码的详细解说请见 求二进制数中1的个数。

更多的 #求二进制数中 1 的个数# 的文章请见:算法-求二进制数中1的个数

 

遗留了一个问题:作者在用二分法求 x 中 1 的个数时,到每 8 位的时候怎么就不写成下面这样了?

(x + (x >>> 8)) & 0x00ff00ff00ff00ffL

 而是直接移位相加?

 

 

 

顺便说,java 中的移位操作有 3 种:

左移 <<

右移 >>>(不带符号右移), >>

 

 

 

 

分享到:
评论
1 楼 vivizhyy 2012-05-25  
via: 王奋进


引用

以统计32位整数为例,假设32位全部为1,16进制表示为
x=0xFFFFFFFF,
经过前三步,就是1、2、4移位运算之后,
x=0x08080808
经过 x = x + (x >>>; 之后
x=0x08101010
再经过x = x + (x >>> 16);之后
x=0x08101820
最后return x & 0x0000003F;
result=0x00000020
可以看到结果是正确的。

具体的原因就是因为32位整数,所有1的个数加起来不会超过0x3F,而64位中1的个数不会超过0x7F,也就是结果最多不过7位。
到移动8位的时候,结果已经聚集到低位来了,高位的结果不会对低位造成影响,所以不用再做额外的与运算。

相关推荐

    lucene org.apache

    org.apache.lucene.analysis.cjk.CJKAnalyzer .......

    apache Lucene4.7最全最新的jar包

    Apache Lucene是一个高性能、全文本搜索库,由Java编写,被广泛用于开发搜索引擎和需要文本检索功能的应用程序。Apache Lucene 4.7是该库的一个版本,它提供了丰富的功能和改进,使得开发者能够轻松地在他们的应用中...

    Lucene.Net.Analysis.Cn.dll

    在C#开发中,搜索引擎的构建是不可或缺的一部分,而Lucene.Net作为一个强大的全文搜索引擎库,为开发者提供了丰富的功能。本文将重点探讨Lucene.Net.Analysis.Cn.dll和Lucene.Net.dll这两个关键组件在C#环境下的作用...

    lucene个人总结

    org.apache.lucene.util - **作用**:提供了一些常用的工具类和常量类的支持。 #### 三、索引文件格式 Lucene使用多种文件格式来存储索引信息: - **fnm**:包含Document中所有Field的名称。 - **fdt** 和 **fdx*...

    lucene-queries-2.9.0.jar 内含有org.apache.lucene.search.DuplicateFilter

    lucene-queries-2.9.0.jar 内含有org.apache.lucene.search.DuplicateFilter

    org.wltea.analyzer.lucene.IKAnalyzer jar

    solr的IK分词器JAR及配置文件 jar包和配置文件的放置位置不一样,详情可搜索 IK Analyzer 是一个开源的,基于java语言开发的轻量级的中文分词工具包。...org.wltea.analyzer.lucene.IKAnalyzer jar

    Lucene学习工具包.zip

    Lucene是一个开源的全文搜索引擎库,由Apache软件基金会开发并维护。这个"Lucene学习工具包.zip"包含了学习Lucene所需的重要资料和资源,旨在帮助开发者深入理解和掌握Lucene的核心概念、功能以及使用方法。本文将...

    与lucene3.0兼容的庖丁jar包

    Exception in thread "main" java.lang.AbstractMethodError: org.apache.lucene.analysis.TokenStream.incrementToken()Z at org.apache.lucene.index.DocInverterPerField.processFields(DocInverterPerField....

    Lucene 倒排原理.docx

    ### Lucene倒排索引原理详解 #### 一、引言 搜索引擎的速度和效率往往令人惊叹,这其中的秘密在于其背后的索引技术。本篇将通过Lucene这一知名的开源全文检索库,来深入探讨搜索引擎是如何利用倒排索引原理实现高效...

    Lucene学习源码.rar

    4. `org.apache.lucene.search.Query` 和 `org.apache.lucene.queryparser.classic.QueryParser`:理解查询的构建和解析过程。 5. `org.apache.lucene.search.Searcher`:研究搜索过程,特别是如何计算相关性和返回...

    Lucene使用

    在使用2012版时异常:ClassNotFoundException: org.apache.lucene.analysis.tokenattributes.CharTermAttribute 庖丁分词 使用 paoding-analysis-2.0.4-beta.zip 版时异常 Exception in thread "main" java.lang....

    lucene-6.5.1

    import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.index.DirectoryReader; import org.apache.lucene.index.IndexWriter; ...

    Lucene 全文检索实践.pdf

    - **任务目标**:编写Java程序`MyIndexer.java`,利用JDBC从MySQL数据库中读取论坛数据,使用`org.apache.lucene.index.IndexWriter`类创建索引。 ##### 实践任务二:实现检索 - **任务目标**:编写Java程序`...

    lucene基本包

    Lucene,作为Apache软件基金会的一个顶级项目,是一个高度成熟、广泛使用的全文检索引擎架构。它为开发者提供了一套强大的工具,用于在各种应用中实现高效的全文搜索功能。这个“lucene基本包”包含了Lucene的核心...

    struts2 + spring + lucene_search 实例

    import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.queryParser.QueryParser; import org.apache.lucene.search.Hits; import ...

    第一个lucene的简单实例....

    luceneTest 博文链接:https://wolftou.iteye.com/blog/148701

    Lucene深入讲解.txt,带你开发搜索引擎

    import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.index.IndexWriter; public ...

    lucene.net.analysis.cn

    Lucene.NET是Apache Lucene项目的一个.NET版本,它是一个开放源代码的信息检索库,提供了强大的文本分析、索引和搜索功能。Lucene.Net完全用C#重写了Java版Lucene的核心算法,保持了与原版的高度兼容性,同时充分...

Global site tag (gtag.js) - Google Analytics