【高分】汇编语言如何获取寄存器连续1的位数

hucailai 2019-02-03 10:59:19
例如寄存器 EAX:

从两个方向,高位和低位
MOV EAX , 1111000100011B


从高位得到4,从低位得到2
求高手支招,考虑性能最优,400分送上。
...全文
163 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
hucailai 2019-02-03
  • 打赏
  • 举报
回复
400分送上,见着有份,100%结贴。
hucailai 2019-02-03
  • 打赏
  • 举报
回复
结贴了,多谢
  • 打赏
  • 举报
回复
引用 7 楼 hucailai 的回复:
左起第一个0位置,那前面的不就正好是全部连续的1吗?


对你的例子:
MOV EAX , 1111000100011B
数据实际是 0000 0000 0000 0000 0001 1110 0010 0011
hucailai 2019-02-03
  • 打赏
  • 举报
回复
左起第一个0位置,那前面的不就正好是全部连续的1吗?
  • 打赏
  • 举报
回复
#2已经是很高效的了,除非有专用指令(popcnt是求1的数量,但不是连续的1),否则不可能几条指令算出来
  • 打赏
  • 举报
回复
不可以,你这样是取左起第一个0的位置
hucailai 2019-02-03
  • 打赏
  • 举报
回复
是不是可以这样 XOR EAX,0xFFFFFFFF ;异或 BSR EAX,EAX ;位扫描 两条指令搞定。
hucailai 2019-02-03
  • 打赏
  • 举报
回复
用到了循环感觉效率不高,还有更好的吗?
  • 打赏
  • 举报
回复
; 求最长连续位1
; input: unsigned integer in eax
; output: result in eax
CC1 proc
mov ecx, eax
mov edx, eax
xor eax, eax
@@loop:
jecxz @@exit
shl ecx, 1
and edx, ecx
inc eax
mov ecx, edx
jmp @@loop
@@exit:
ret
CC1 endp

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧