The best method for counting bits in a 32-bit integer

本文介绍了一种高效的32位整数中1的位数计数方法。通过巧妙利用位操作和预定义的常数值,该算法能在极短的时间内完成计算。示例展示了每一步的具体实现细节。

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

 

B[0] = 0x55555555 = 01010101 01010101 01010101 01010101
B[1] = 0x33333333 = 00110011 00110011 00110011 00110011
B[2] = 0x0F0F0F0F = 00001111 00001111 00001111 00001111
B[3] = 0x00FF00FF = 00000000 11111111 00000000 11111111
B[4] = 0x0000FFFF = 00000000 00000000 11111111 11111111

 

The best method for counting bits in a 32-bit integer v is the following:

v = v - ((v >> 1) & 0x55555555);                    // reuse input as temporary
v = (v & 0x33333333) + ((v >> 2) & 0x33333333); // temp
c = ((v + (v >> 4) & 0xF0F0F0F) * 0x1010101) >> 24; // count


 

http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetParallel 


 

 












B[0] = 0x55555555 = 01010101 01010101 01010101 01010101





B[1] = 0x33333333 = 00110011 00110011 00110011 00110011





B[2] = 0x0F0F0F0F = 00001111 00001111 00001111 00001111





B[3] = 0x00FF00FF = 00000000 11111111 00000000 11111111





B[4] = 0x0000FFFF = 00000000 00000000 11111111 11111111















The best method for counting bits in a 32-bit integer v is the following:












v = v - ((v >> 1) & 0x55555555);                    // reuse input as temporary




v = (v & 0x33333333) + ((v >> 2) & 0x33333333);     // temp






c = ((v + (v >> 4) & 0xF0F0F0F) * 0x1010101) >> 24; // count1





 01010101 01010101 01010101 01010101




v=

00000111




v >> 1


00000011




((v >> 1) & 0x55555555)00000000000000000000000000000001





11111111111111111111111111111111




v = v - ((v >> 1) & 0x55555555);           10000000000000000000000000000110





00110011001100110011001100110011




 (v & 0x33333333)00000000000000000000000000000010




 ((v >> 2) & 0x33333333);


00000001








000000110x1010101







 00000001000000010000000100000001






00000001000000010000000100000001

c = ((v + (v >> 4) & 0xF0F0F0F) * 0x1010101) >> 24; // count00000011










































 

转载于:https://www.cnblogs.com/jonasli/archive/2010/03/13/1685260.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值