找回密码
 欢迎注册
楼主: gxqcn

[擂台] 求bit位为1数目不超出2的正整数

[复制链接]
发表于 2009-2-3 21:29:25 | 显示全部楼层
好像,嵌入汇编只需要写出变量,编译器会自动翻译为对应的地址偏移形式吧
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-2-3 21:34:22 | 显示全部楼层
可以得到几个结论 1、位运算能不用就不用 2、跳转不一定不好 3、太追求精简也不行 ======================= 不过综合来说, 59#是最好的
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-2-3 21:40:14 | 显示全部楼层
呵呵, 59#原理和我36#是一样的 我被宝宝说的不敢用ebx, esi, edi了 看来用内存数据使用位指令并不好 另外,push/pop完全可以用 movd xmm0, ebx/movd ebx, xmm0代替 应该还快点, 呵呵
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-2-3 21:42:49 | 显示全部楼层
AMD 36#表现好,是否表示其内置内存控制器有比较优秀的内存Cache控制能力??
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-2-3 21:44:04 | 显示全部楼层

回复 63# 无心人 的帖子

我不是说了吗:59# 改编自你的36#, 主要是将访问内存改成访问寄存器。 除了edx,eax,ecx,其它寄存器函数调用后是需要恢复原值的。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-2-3 21:49:45 | 显示全部楼层
对了,SSE4 出了个新指令:POPCNT,可以直接得到一个整数的bit=1的数目。 按照《Software Optimization Guide for AMD Family 10h Processors》上的说法: 典型延迟:POPCNT reg,reg 2 POPCNT reg,mem 5 最慢情况都是6 看来效率要好于BSF/BSR 老兄可否调试出一版?(我是没有那个条件了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-2-3 21:52:06 | 显示全部楼层
Intel支持么? 你家俩电脑,比俺强多了 你测试下,用 xmm保存ebx 的情况 应该能节约掉一部分内存读写 至少xmm 读写速度是一级缓存的2-3倍吧
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-2-3 21:57:21 | 显示全部楼层
http://en.wikipedia.org/wiki/SSE4 好像i7才支持popcnt AMD的U俺学校是么有的
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-2-3 21:58:30 | 显示全部楼层

回复 67# 无心人 的帖子

考虑到兼容性,在效率保证的前提下,尽量用较老的指令集。 这样吧,考虑到要移植到64bit平台, 大家可以接着来写个:
  1. UINT64 GreaterEqualBit2( UINT64 n /* 1 <= n <= 2^63+2^62 */ )
复制代码
顺便对64位平台下的汇编练练手 (应该更游刃有余,因为可用寄存器更多了)。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-2-3 22:18:17 | 显示全部楼层
那简单了,去掉push ebx/pop ebx 使用r8替换ebx rax替换eax, rcx替换ecx,rdx替换edx ... OK
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-11-24 20:20 , Processed in 0.023494 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表