您的位置:首页 > 编程语言 > C语言/C++

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

2016-01-16 21:20 465 查看
代码如下,调用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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C-C++ 编程