首页 新闻 赞助 找找看

您好,请问这移位算法的思想是什么:计算某char变量bit位为1的总数目。

0
悬赏园豆:80 [已解决问题] 解决于 2011-12-21 15:38

初学者,请多指教。

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;

}

ITMelody的主页 ITMelody | 初学一级 | 园豆:128
提问于:2011-12-16 12:36
< >
分享
最佳答案
1

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位

收获园豆:70
Jooooooker | 菜鸟二级 |园豆:280 | 2011-12-21 15:08

哈哈,谢谢,感激不尽.

ITMelody | 园豆:128 (初学一级) | 2011-12-21 15:37
其他回答(2)
0

你先把0x55,0x33转成二进制数,看看就明白。

收获园豆:5
cuishuyue | 园豆:37 (初学一级) | 2011-12-16 15:03
0

同问. 

这个解法好像跟卡诺图有关, 记得 matrix67 上有过描述, 我在博客引用了另外一个网址, 请参考 http://www.cnblogs.com/walfud/articles/2267167.html 页中最下边的链接. 是斯坦福大学的, 经典.

收获园豆:5
walfud | 园豆:210 (菜鸟二级) | 2011-12-17 21:43
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册