如何实现特定于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), %edx
    bsr %edx, %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
    

要回复问题请先登录注册