网上对这段代码相关内容介绍非常少,给出下知识背景:
输入文本格式:
Hamburg;12.0
Bulawayo;8.9
Palembang;38.8
St. John's;15.2
Cracow;12.6
Bridgetown;26.9
Istanbul;6.2
Roseau;34.4
Conakry;31.2
Istanbul;23.0
前面是气象站名称,后面是温度(注意是华氏度)
这里关注一个优化点,如何最高效的分离出;所在的位置。
基本思想:
1. 根据mmap,从文本中一次读取一个64位的数据(通过unsafe),按照long类型读出来
2. 从long类型的数据中确定是否存在;
第二步精析:
1. long SEMICOLON_PATTERN = 0X3BL; // ;的accic码
2. 假设读取到的long类型的数据为0x3B00000000000000L
3. long match = i ^ SEMICOLON_PATTERN
4. 异或的结果是如果存在分号,则必然在某一段字节不为0。如果不存在分号,则全部的字节必然全部不为0.按照示例step2中为例,则前两个字节必然为0.
5. 问题划归到如何判断patternMatch中是否有字段为0的问题
该问题解析为:
long mask = ((match - 0x0101010101010101L) & ~match) & 0x8080808080808080L;
如果mask !=0 ,则必然其中包含分号。如果=0,则不包含。