代码之美阅读笔记之--种群计数
来源:互联网 发布:下载录制屏幕软件 编辑:程序博客网 时间:2024/05/22 17:39
第10章 寻求快速的种群计数
种群计数(PopulationCount)或横列和(SidewaysSums)是计算机中基本且出奇简单的算法,用于统计单位计算机字长包含的1位的数量。
基本方法:
实例1:
pop = 0;
while(x){
pop= pop + ( x & 1);
x =x >> 1;
}
实例2:
pop = 0;
while(x){
pop= pop + 1;
x =x & (x-1); //将x的最低的bit值为1的位清零。
}
分治方法:
思路是分治法思路,要计数32bit的1的个数,分别先计数出左右2个16 bit内的1的个数。依次类推,最后变成先计数16组2 bit内的1的个数。算法执行了Log2( 32 ) = 5 步。
详细原理说明,参照:http://www.matrix67.com/blog/archives/264内的 “计算二进制中的1的个数“部分。
实例1:
x = ( x & 0x55555555 ) + ( ( x >>1) & 0x55555555 );
x = ( x & 0x33333333) + ( ( x >>2) & 0x33333333);
x = ( x & 0x0F0F0F0F)+ ( ( x >> 4) & 0x0F0F0F0F);
x = ( x & 0x00FF00FF) + ( ( x >>8) & 0x00FF00FF);
x = ( x & 0x0000FFFF) + ( ( x >> 16)& 0x00FF00FF);
实例2:
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;
}
应用:
种群计数指令可以用于计算字中后缀0的数目,使用如下的关系式:
ntz( x ) = pop( ~x & (x - 1 )) = 32 –pop( x | -x );
函数ntz( x )的应用非常广泛。如用于中断优先顺序的判断。
计算机界传言,种群计数对美国NSA而言非常重要。很有可能是关于加密工作或海量材料的搜索
- 代码之美阅读笔记之--种群计数
- 《代码之美》阅读笔记
- 《编程之美》阅读笔记
- 阅读架构之美笔记
- 《数学之美》阅读笔记
- [转]《数学之美》 阅读笔记
- 数学之美阅读笔记2
- 数学之美阅读笔记(1)
- 数学之美阅读笔记(2)
- 数学之美~阅读
- 《数学之美》阅读笔记之Google搜索技术浅析
- 种群计数 (pop_count)
- 编程之美阅读笔记--发帖水王
- 编程之美阅读心得
- 代码整洁之道--阅读笔记
- MySQL源码阅读笔记之代码结构
- 代码整洁之道阅读笔记
- 代码之美
- POJ 2080 Calendar
- Trac+subversion拥有强大的bug管理能力
- [转]悟透JavaScript
- error C2065: 'WM_SETMESSAGESTRING' : undeclared identifier
- 【转】高级PHP应用程序漏洞审核技术
- 代码之美阅读笔记之--种群计数
- error LNK2019: 无法解析的外部符号 _main,该符号在函数 ___tmainCRTStartup 中被引用 msvcrtd.lib
- 网络知识 关于IPv6的寻址和路由方法介绍
- error C2018: unknown character '0xa1'
- arm-linux-gcc-4.4.1+Linux-2.6.31.6+busybox-1.15.1在TQ2440的移植
- VMware虚拟机的联网
- 第一篇
- django框架
- 升级Virtualbox引起的麻烦