初学者,请多指教。
size_t func( char x ) /* 就这个函数 */
{
x = (x & 0x55) + ((x>>1) & 0x55);
x = (x & 0x33) + ((x>>2) & 0x33);
x = (x & 0x0f) + ((x>>4) & 0x0f);
return x;
}
#include <iostream>
using namespace std;int main()
{
cout << func('a') << endl;
cout << func(0x00) << endl;
cout << func(0xFF) << endl; return 0;
}
01010101 即为0X55
00110011 即为0X33
00001111 即为0X0F
首先 char是8Bit 那么通过
x = (x & 0x55) + ((x>>1) & 0x55);
这个运算 加号左边计算0 2 4 6位是否为1 并且屏蔽1 3 5 7 位
加号右边计算1 3 5 7位是否为1 屏蔽 2 4 6位 丢弃0位 且char应该是unsign,右移即为逻辑右移 高位补零 不影响结果
这样就将这个char两位两位的分组(76,54,32,10) 每组1的个数分别保存在这写组中
x = (x & 0x33) + ((x>>2) & 0x33);
这个运算 仿上进行 分组为(7654,3210) 并且将1的个数放在654,210位
最后也是一样了 放到最低4位里面 然后输出结果
其实中间有些位并没有用到 比如 第二步中的 7和3位 以及第三步的7654位
哈哈,谢谢,感激不尽.
你先把0x55,0x33转成二进制数,看看就明白。
同问.
这个解法好像跟卡诺图有关, 记得 matrix67 上有过描述, 我在博客引用了另外一个网址, 请参考 http://www.cnblogs.com/walfud/articles/2267167.html 页中最下边的链接. 是斯坦福大学的, 经典.