如何实现MS特定的_BitScanReverse()函数

How to implement MS specific _BitScanReverse() function?

本文关键字:BitScanReverse 函数 MS 何实现 实现      更新时间:2023-10-16

来自MSDN在掩码数据中从最高有效位(MSB)到最低有效位(LSB)搜索设置位(1)。

无符号字符_BitScanReverse(无符号长*索引,无符号长掩码)

参数[out]索引加载了找到的第一个设置位(1)的位位置。

[in]掩码要搜索的32位或64位值。

返回值如果掩码为零,则为0;否则为非零。

备注如果找到设置位,则在第一参数中返回找到的第一个设置位的位位置。如果没有找到设置位,则返回0;否则返回1。


请告诉我如何在OSX上实现安全快速的_BitScanReverse()函数?我必须使用汇编还是有更简单的方法?

GCC有一些类似的内置程序:

--内置函数:int __builtin_clz(unsigned int x)

返回x中从最高有效位开始的前导0位的数目。如果x为0,则结果未定义。

--内置函数:int __builtin_ctz(unsigned int x)

返回x中从最低有效位位置开始的尾随0位的数目。如果x为0,则结果为未定义

如果你有零的数量,你应该能够计算出第一个1在哪里。:-)

下面的代码是我不久前为Linux编写的,它找到了最高集位,我认为这正是您所要求的。它不符合你的确切规格,但应该很容易适应。

进一步说明:

  • 返回0意味着设置了位0;如果没有找到比特,则返回64
  • 这个汇编程序是为GCC在Linux下使用的调用约定而编写的。我不知道这在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
相关文章:
  • 没有找到相关文章