找回密码
 欢迎注册
楼主: 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-4-19 03:48 , Processed in 0.042934 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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