今天读 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 种:
左移 <<
右移 >>>(不带符号右移), >>
分享到:
相关推荐
org.apache.lucene.analysis.cjk.CJKAnalyzer .......
Apache Lucene是一个高性能、全文本搜索库,由Java编写,被广泛用于开发搜索引擎和需要文本检索功能的应用程序。Apache Lucene 4.7是该库的一个版本,它提供了丰富的功能和改进,使得开发者能够轻松地在他们的应用中...
在C#开发中,搜索引擎的构建是不可或缺的一部分,而Lucene.Net作为一个强大的全文搜索引擎库,为开发者提供了丰富的功能。本文将重点探讨Lucene.Net.Analysis.Cn.dll和Lucene.Net.dll这两个关键组件在C#环境下的作用...
org.apache.lucene.util - **作用**:提供了一些常用的工具类和常量类的支持。 #### 三、索引文件格式 Lucene使用多种文件格式来存储索引信息: - **fnm**:包含Document中所有Field的名称。 - **fdt** 和 **fdx*...
lucene-queries-2.9.0.jar 内含有org.apache.lucene.search.DuplicateFilter
solr的IK分词器JAR及配置文件 jar包和配置文件的放置位置不一样,详情可搜索 IK Analyzer 是一个开源的,基于java语言开发的轻量级的中文分词工具包。...org.wltea.analyzer.lucene.IKAnalyzer jar
Lucene是一个开源的全文搜索引擎库,由Apache软件基金会开发并维护。这个"Lucene学习工具包.zip"包含了学习Lucene所需的重要资料和资源,旨在帮助开发者深入理解和掌握Lucene的核心概念、功能以及使用方法。本文将...
Exception in thread "main" java.lang.AbstractMethodError: org.apache.lucene.analysis.TokenStream.incrementToken()Z at org.apache.lucene.index.DocInverterPerField.processFields(DocInverterPerField....
### Lucene倒排索引原理详解 #### 一、引言 搜索引擎的速度和效率往往令人惊叹,这其中的秘密在于其背后的索引技术。本篇将通过Lucene这一知名的开源全文检索库,来深入探讨搜索引擎是如何利用倒排索引原理实现高效...
4. `org.apache.lucene.search.Query` 和 `org.apache.lucene.queryparser.classic.QueryParser`:理解查询的构建和解析过程。 5. `org.apache.lucene.search.Searcher`:研究搜索过程,特别是如何计算相关性和返回...
在使用2012版时异常:ClassNotFoundException: org.apache.lucene.analysis.tokenattributes.CharTermAttribute 庖丁分词 使用 paoding-analysis-2.0.4-beta.zip 版时异常 Exception in thread "main" java.lang....
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; ...
- **任务目标**:编写Java程序`MyIndexer.java`,利用JDBC从MySQL数据库中读取论坛数据,使用`org.apache.lucene.index.IndexWriter`类创建索引。 ##### 实践任务二:实现检索 - **任务目标**:编写Java程序`...
Lucene,作为Apache软件基金会的一个顶级项目,是一个高度成熟、广泛使用的全文检索引擎架构。它为开发者提供了一套强大的工具,用于在各种应用中实现高效的全文搜索功能。这个“lucene基本包”包含了Lucene的核心...
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 ...
luceneTest 博文链接:https://wolftou.iteye.com/blog/148701
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是Apache Lucene项目的一个.NET版本,它是一个开放源代码的信息检索库,提供了强大的文本分析、索引和搜索功能。Lucene.Net完全用C#重写了Java版Lucene的核心算法,保持了与原版的高度兼容性,同时充分...