代码之美阅读笔记之--种群计数

本文介绍了种群计数(Population Count)算法,即统计计算机字长中1的个数。通过两种基本方法和分治策略详细阐述算法实现,并给出实例。种群计数在计算后缀0的数目和中断优先顺序判断等方面有广泛应用,据传在加密工作和大规模数据搜索中也扮演关键角色。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

第10章           寻求快速的种群计数

种群计数(Population Count)或横列和(Sideways Sums)是计算机中基本且出奇简单的算法,用于统计单位计算机字长包含的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的位清零。

}

 

分治方法:

思路是分治法思路,要计数32 bit1的个数,分别先计数出左右216  bit内的1的个数。依次类推,最后变成先计数162 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而言非常重要。很有可能是关于加密工作或海量材料的搜索

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值