temp = (temp & 0x55555555) + ((temp & 0xaaaaaaaa) >> 1)

代码如下,调用func(0x11530828):

int func(unsigned int i) {
unsigned int temp = i;
 1:temp = (temp & 0x55555555) + ((temp & 0xaaaaaaaa) >> 1);
 2:temp = (temp & 0x33333333) + ((temp & 0xcccccccc) >> 2);
 3:temp = (temp & 0x0f0f0f0f) + ((temp & 0xf0f0f0f0) >> 4);
 4:temp = (temp & 0x00ff00ff) + ((temp & 0xff00ff00) >> 8);
 5:temp = (temp & 0x0000ffff) + ((temp & 0xffff0000) >> 16); 
 return temp;
 }

对1、2、3、4、5整理,如下:

 1:temp = (temp & 0x55555555) + ((temp >> 1)& 0x55555555);
 2:temp = (temp & 0x33333333) + ((temp >> 2) & 0x33333333);
 3:temp = (temp & 0x0f0f0f0f) + ((temp >> 4) & 0x0f0f0f0f);
 4:temp = (temp & 0x00ff00ff) + ((temp >> 8) & 0x00ff00ff);
 5:temp = (temp & 0x0000ffff) + ((temp >> 16) & 0x0000ffff); 

输入:temp=0001 0001 0101 0011 0000 1000 0010 1000

序号1的代码等价于:将temp中32位二进制码,从低位到高位起,2位作为一个整体,对这个整体做第2位加第1位,总共会出现三种情况:10、01、11,相加后的结构分别为01、01、10,下面对temp进行上述规则处理:
原始数据:00 01 00 01 01 01 00 11 00 00 10 00 00 10 10 00
处理后的:00 01 00 01 01 01 00 10 00 00 01 00 00 01 01 00(运行代码1之后temp的值);

序号2的代码等价于:将temp中32位二进制码,从低位到高位起,4位作为一个整体,对这个整体做第4位加第2位、第3位加第1位,每次相加只会出现三种情况:10、01、11,相加后的结构分别为01、01、10,下面对temp进行上述规则处理:
处理前:0001 0001 0101 0010 0000 0100 0001 0100
处理后:0001 0001 0010 0010 0000 0001 0001 0001

序号3的代码等价于:将temp中32位二进制码,从低位到高位起,8位作为一个整体,对这个整体做第8位加第4位、第7位加第3位、第6位加第2位、第5位加第1位,每次相加只会出现三种情况:10、01、11,相加后的结构分别为01、01、10,下面对temp进行上述规则处理:
处理前:00010001 00100010 00000001 00010001
处理后:00000010 00000100 00000001 00000010

序号4的代码等价于:将temp中32位二进制码,从低位到高位起,16位作为一个整体,对这个整体做第16位加第8位、第15位加第7位、第14位加第6位、第13位加第5位、第12位加第4位、第11位加第3位、第10位加第2位、第9位加第1位,每次相加只会出现三种情况:10、01、11,相加后的结构分别为01、01、10,下面对temp进行上述规则处理:
处理前:0000001000000100 0000000100000010
处理后:0000000000000110 0000000000000011

同上,对于序号5的代码:
处理前:00000000000001100000000000000011
处理后:00000000000000000000000000001001
所以输出结果为:9。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值