|
发表于 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 编辑 ] |
|