如何实现特定于MS的_BitScanReverse函数?

问题描述

| 从MSDN 在掩码数据中从最高有效位(MSB)到最低有效位(LSB)搜索设置位(1)。 无符号字符_BitScanReverse (    无符号长*索引,    无符号长掩码 ); 参量 [出]索引 加载找到的第一个置位(1)的位位置。 [在]面具 要搜索的32位或64位值。 返回值 如果掩码为零,则为0;否则为0。否则为非零。 备注 如果找到一个设置位,则在第一个参数中返回找到的第一个设置位的位位置。如果找不到设置位,则返回0;否则,返回0。否则,返回1。 请告诉我如何在OS X上实现安全快速的_BitScanReverse()函数?我必须使用汇编还是有更简单的方法?     

解决方法

        GCC具有一些类似的内置函数:   —内置函数:int __builtin_clz(无符号int x)      从最高有效位开始,返回x中前导0位的数目。如果x为0,则结果不确定。      —内置函数:int __builtin_ctz(无符号int x)      返回x中从最低有效位位置开始的尾随0位的数目。如果x为0,则结果不确定 如果您有零个数字,则应该能够找出第一个1的位置。 :-)     ,        下面的代码是我为Linux编写的一段时间-它找到最高的设置位,我认为这是您所要的。它不符合您的确切规格,但应易于适应。 进一步说明: 返回0表示设置了位0;否则返回0。如果找不到位,则返回64。 该汇编器是为Linux下GCC使用的调用约定编写的。我不知道在Mac OS X下这有何不同-您需要检查一下。 输入是一个64位无符号整数。 每个CPU体系结构都写入一个单独的.S源文件中,并根据要构建的目标使用\'gcc \'有选择地进行编译。我不使用内联汇编器。 x86:
/*
 * Find the highest set bit in a bitboard.
 *
 * %eax: &bb
 */
.globl x86_msb;
.type x86_msb,@function;
x86_msb:
    mov 4(%eax),%edx
    bsr %edx,%eax
    jz msb_z1
    add $32,%eax
    ret
msb_z1:
    mov (%eax),%eax
    jz msb_z2
    ret
msb_z2:
    mov $64,%eax
    ret
x86_64:
/*
 * Return the offset of the highest set bit in the bitmask
 *
 * %rdi: &bb
 */
.globl x64_msb;
.type x64_msb,@function;
x64_msb:
    movq (%rdi),%rdi
    bsrq %rdi,%rax
    jz msb_empty
    ret
msb_empty:
    mov $64,%eax
    ret
这是Windows的实现(.asm文件): x86:
;;
;; Return the offset of the highest set bit in the bitmask
;;
;; ECX: &bb
;;
public @x86_msb@4
@x86_msb@4:
    mov edx,dword ptr [ecx + 4]    ; bb (high)
    bsr eax,edx
    jz msb_z1
    add eax,32
    ret
msb_z1:
    mov edx,dword ptr [ecx]        ; bb (low)
    bsr eax,edx
    jz msb_z2
    ret
msb_z2:
    mov eax,64
    ret                         ; bb is empty
x86_64:
;;
;; Return the offset of the highest set bit in the bitmask
;;
;; RCX: &bb
;;
x64_msb PROC
    mov r8,qword ptr [rcx] ; r8 = bb
    bsr rax,r8         ; rax = lsb(bb)
    jz msb_empty
    ret
msb_empty:
    mov eax,64         ; bb was empty
    ret
x64_msb ENDP
    

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...