- 论坛徽章:
- 0
|
原帖由 liubinbj 于 2006-7-21 11:29 发表
仅适用于比较苛刻计算的场合,大量的大循环计算,少量的计算楼主的算法已经够好了。
注意到你曾经提到过这个用例:
例如:在n!中2的因子的个数=n-(n的二进制中1的个数)
如:10!2的因子个数为2、6、10各1个 ...
对于一个大整数n,它的位数大约为log2(n),按你的做法是11位11位地进行计算,所以大约需log2(n)/11次计算
而用下面这个:
- unsigned numbits(unsigned int i)
- {
- unsigned int const MASK1 = 0x55555555;
- unsigned int const MASK2 = 0x33333333;
- unsigned int const MASK4 = 0x0f0f0f0f;
- unsigned int const MASK8 = 0x00ff00ff;
- unsigned int const MASK16 = 0x0000ffff;
-
- i = (i&MASK1 ) + (i>>1 &MASK1 );
- i = (i&MASK2 ) + (i>>2 &MASK2 );
- i = (i&MASK4 ) + (i>>4 &MASK4 );
- i = (i&MASK8 ) + (i>>8 &MASK8 );
- i = (i&MASK16) + (i>>16&MASK16);
-
- return i;
- }
复制代码
用到的次数是log2(log2(n))的
当log2(n)/11 > log2(log2(n)), 至少当n>2^2^7(^这里是乘方)时,你的程序速度就比它慢了
另外,你好象没看懂我(yuxh)那个用例吧?
[ 本帖最后由 yzc2002 于 2006-7-21 12:24 编辑 ] |
|