以前在论坛中看到一个题目,下面是答案,希望有大拿可以解释一下
时间:10-02
整理:3721RD
点击:
如何求一个数二进制表示中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数
代码如下:
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数
请高人指点!
大体思路:
第一步,就是将要计算的数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个循环,而小编的题目中采用的方法就是减少循环次数而已。
学习一下~
forget about the pass length.. the simplest way to do is
for(i=0;i<width;i=i+1)
result = result + signal;
good
只能顶了!
