//来自:hs-kill
//.....17 shr 2
应该是shl才对
//EAX->InInt LOG->EAX
//没有保存ECX,我记得好像ECX是可以直接使用的,如果需要可以添加
MOV ECX, 32
@LP_1:
SHL EAX
JNC @THIS_POS
LOOP @LP_1
@THIS_POS:
MOV EAX, ECX
DEC EAX
RET
对于优化,其实也可以分段判断是否为0
MOV ECX,0
ROL EAX,16
CMP AX,0
JNZ @LP_1 //高16位有1,现在在AX
...
SHL AL
JNC @...
LOOP @LP_2
可以细分到BYTE/WORD
而至于>32位的整数,应该数据科学计算的范畴.不过如果在Intel计算机上有一个好处,就是高高低低(高位高址),因此可以使用字串扫描语句查找非0的最高位的字节.找到此字节之后,然后SHL扫描具体是哪一位,
然后计算一下具体位数即可.
上边的实例代码之中可能会涉及到和答案相差1,根据需要调整即可,身边没有环境编写调试.思路如上