在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 3127|回复: 7

以前在论坛中看到一个题目,下面是答案,希望有大拿可以解释一下

[复制链接]
发表于 2008-6-17 00:22:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
如何求一个数二进制表示中1的个数?
代码如下:
x = (x & 0x55555555) + ((x>>1) & 0x55555555);
x = (x & 0x33333333) + ((x>>2) & 0x33333333);
x = (x & 0x0f0f0f0f) + ((x>>4) & 0x0f0f0f0f);
x += (x>>8); x += (x>>16);
return (x & 0x00ff);

这里是否定义的是返回一个32bit数中的1的bit数
发表于 2008-6-17 09:33:17 | 显示全部楼层
请高人指点!!!
发表于 2008-6-17 10:14:17 | 显示全部楼层
大体思路:
第一步,就是将要计算的数X的每相邻的两位相加,结果用2-bit表示,即可以用2-bit来表示X相邻的两位有几个1,相邻2-bit相加的结果可能为二进制的00,01,10 ,这样求出的X的每相邻连续2-bit就表明了原始X的相邻2-bit的个数(假设算出的值为X1,则X1的[2a+1:2a]位的二进制值表示了X的[2a+1:2a]bit段的1的个数,在此时如何求原始数据X中1的个数呢?很简单,只要把这些2-bit的结果连续相加就对了,以后每一步都是在朝这个方向努力)。
第二步,将第一步的结果的每2-bit为一个单位,取相邻的两个单位再次进行相加,继续沿着第一步的方向计算(涉及到进位情况,每两位就不一定表示的是X1的4-bit中相邻两个2-bit的和,但是总体的结果不变)
第三步,将第二步的结果以4-bit为单位进行相加,和第二步的意义相似
依次类推,直到将最后的和算出来。

说的更简单一点,要求一个2-bit的数中有几个1,直接将两位相加得到2-bit的二进制就可以表示了,而要求一个2N-bit的数中有多少个1,就要把2N-bit拆分为N个2-bit,分别算出每个2-bit中1的个数,再将这些值相加就可以了。要将这些直接相加,需要N个循环,而楼主的题目中采用的方法就是减少循环次数而已。

[ 本帖最后由 hahalucky 于 2008-6-17 10:30 编辑 ]
发表于 2008-6-19 11:00:51 | 显示全部楼层
学习一下~
发表于 2008-6-20 03:47:15 | 显示全部楼层
forget about the pass length.. the simplest way to do is

for(i=0;i<width;i=i+1)
  result = result + signal;
头像被屏蔽
发表于 2008-6-20 10:24:09 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2008-6-22 23:21:42 | 显示全部楼层
学习了
发表于 2008-6-23 11:26:29 | 显示全部楼层
只能顶了!!!!!!!!!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-16 15:53 , Processed in 0.021611 second(s), 10 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表