- 注册时间
- 2007-12-26
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 92615
- 在线时间
- 小时
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?欢迎注册
×
已知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楼,是本人原创的。
可否有更美妙的算法? |
评分
-
查看全部评分
|