- 注册时间
 - 2007-12-26
 
- 最后登录
 - 1970-1-1
 
- 威望
 -  星
 
- 金币
 -  枚
 
- 贡献
 -  分
 
- 经验
 -  点
 
- 鲜花
 -  朵
 
- 魅力
 -  点
 
- 上传
 -  次
 
- 下载
 -  次
 
- 积分
 - 92885
 
- 在线时间
 -  小时
 
 
 
 
 
 
 | 
 
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?欢迎注册  
 
×
 
已知32位中有n(0 <= n <= 32)个1。 
要求:快速找处所有的1位索引数值。
一般的算法,都需要大量的跳转指令才能完成,
而CPU一旦分支预测失败,将会有很大的惩罚,应尽可能避免。
下面是我想到的一种完全无跳转指令的算法,抛出来与大家共享:- // 作者:GxQ,2008-03-03
 - // 返回返回当前bit=1的数目
 - DWORD find_by_GxQ(DWORD code, int index[33])
 - {
 -     __asm
 -     {
 -         mov     ecx, code;
 -         mov     edx, dword ptr index;
 - 
 -         xor     eax, eax;
 - 
 -         shr     ecx, 1;
 -         mov     dword ptr[edx + 4*eax], 0;
 -         adc     eax, 0;
 - 
 -         shr     ecx, 1;
 -         mov     dword ptr[edx + 4*eax], 1;
 -         adc     eax, 0;
 - 
 -         shr     ecx, 1;
 -         mov     dword ptr[edx + 4*eax], 2;
 -         adc     eax, 0;
 - 
 -         shr     ecx, 1;
 -         mov     dword ptr[edx + 4*eax], 3;
 -         adc     eax, 0;
 - 
 -         shr     ecx, 1;
 -         mov     dword ptr[edx + 4*eax], 4;
 -         adc     eax, 0;
 - 
 -         shr     ecx, 1;
 -         mov     dword ptr[edx + 4*eax], 5;
 -         adc     eax, 0;
 - 
 -         shr     ecx, 1;
 -         mov     dword ptr[edx + 4*eax], 6;
 -         adc     eax, 0;
 - 
 -         shr     ecx, 1;
 -         mov     dword ptr[edx + 4*eax], 7;
 -         adc     eax, 0;
 - 
 -         shr     ecx, 1;
 -         mov     dword ptr[edx + 4*eax], 8;
 -         adc     eax, 0;
 - 
 -         shr     ecx, 1;
 -         mov     dword ptr[edx + 4*eax], 9;
 -         adc     eax, 0;
 - 
 -         shr     ecx, 1;
 -         mov     dword ptr[edx + 4*eax], 10;
 -         adc     eax, 0;
 - 
 -         shr     ecx, 1;
 -         mov     dword ptr[edx + 4*eax], 11;
 -         adc     eax, 0;
 - 
 -         shr     ecx, 1;
 -         mov     dword ptr[edx + 4*eax], 12;
 -         adc     eax, 0;
 - 
 -         shr     ecx, 1;
 -         mov     dword ptr[edx + 4*eax], 13;
 -         adc     eax, 0;
 - 
 -         shr     ecx, 1;
 -         mov     dword ptr[edx + 4*eax], 14;
 -         adc     eax, 0;
 - 
 -         shr     ecx, 1;
 -         mov     dword ptr[edx + 4*eax], 15;
 -         adc     eax, 0;
 - 
 -         shr     ecx, 1;
 -         mov     dword ptr[edx + 4*eax], 16;
 -         adc     eax, 0;
 - 
 -         shr     ecx, 1;
 -         mov     dword ptr[edx + 4*eax], 17;
 -         adc     eax, 0;
 - 
 -         shr     ecx, 1;
 -         mov     dword ptr[edx + 4*eax], 18;
 -         adc     eax, 0;
 - 
 -         shr     ecx, 1;
 -         mov     dword ptr[edx + 4*eax], 19;
 -         adc     eax, 0;
 - 
 -         shr     ecx, 1;
 -         mov     dword ptr[edx + 4*eax], 20;
 -         adc     eax, 0;
 - 
 -         shr     ecx, 1;
 -         mov     dword ptr[edx + 4*eax], 21;
 -         adc     eax, 0;
 - 
 -         shr     ecx, 1;
 -         mov     dword ptr[edx + 4*eax], 22;
 -         adc     eax, 0;
 - 
 -         shr     ecx, 1;
 -         mov     dword ptr[edx + 4*eax], 23;
 -         adc     eax, 0;
 - 
 -         shr     ecx, 1;
 -         mov     dword ptr[edx + 4*eax], 24;
 -         adc     eax, 0;
 - 
 -         shr     ecx, 1;
 -         mov     dword ptr[edx + 4*eax], 25;
 -         adc     eax, 0;
 - 
 -         shr     ecx, 1;
 -         mov     dword ptr[edx + 4*eax], 26;
 -         adc     eax, 0;
 - 
 -         shr     ecx, 1;
 -         mov     dword ptr[edx + 4*eax], 27;
 -         adc     eax, 0;
 - 
 -         shr     ecx, 1;
 -         mov     dword ptr[edx + 4*eax], 28;
 -         adc     eax, 0;
 - 
 -         shr     ecx, 1;
 -         mov     dword ptr[edx + 4*eax], 29;
 -         adc     eax, 0;
 - 
 -         shr     ecx, 1;
 -         mov     dword ptr[edx + 4*eax], 30;
 -         adc     eax, 0;
 - 
 -         shr     ecx, 1;
 -         mov     dword ptr[edx + 4*eax], 31;
 -         adc     eax, 0;
 - 
 -         // 休止符
 -         mov     dword ptr[edx + 4*eax], -1;
 -     }
 - }
 
  复制代码 以上代码涉及的汇编指令非常少,稍微有些ALU汇编指令基础的朋友很容易揣摩出其门道。
本文部分摘自:http://topic.csdn.net/u/20080217 ... c-9734e7a2b41b.html,
上述代码在其68楼,是本人原创的。 
可否有更美妙的算法? |   
 
评分
- 
查看全部评分
 
 
 
 
 
 |