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

C++ 如何实现MS特定的_BitScanReverse()函数?,c++,visual-c++,gcc,bits,C++,Visual C++,Gcc,Bits,来自MSDN 从最高有效位(MSB)到最低有效位(LSB)搜索掩码数据以查找设置位(1) 无符号字符\u位扫描反向 ( 无符号长*索引, 无符号长掩码 ); 参数 [out]索引 加载找到的第一个设置位(1)的位位置 [在]面具 要搜索的32位或64位值 返回值 如果掩码为零,则为0;否则为非零 备注 如果找到设定位,则在第一个参数中返回找到的第一个设定位的位位置。如果未找到设置位,则返回0;否则,返回1 请告诉我如何在OS X上实现安全快速的\u BitScanReverse()功能?我必须

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

无符号字符\u位扫描反向 ( 无符号长*索引, 无符号长掩码 );

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

[在]面具 要搜索的32位或64位值

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

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



请告诉我如何在OS X上实现安全快速的\u BitScanReverse()功能?我必须使用汇编还是有更简单的方法?

下面的代码是我不久前为Linux编写的—它可以找到最高的集合位,我想这正是您所要求的。它不符合您的具体规格,但应易于适应

进一步说明:

  • 返回0表示设置了位-0;如果未找到位,则返回64
  • 这个汇编程序是为Linux下GCC使用的调用约定编写的。我不知道这在MacOSX下有什么不同-你需要检查一下
  • 输入为64位无符号整数
  • 每个CPU体系结构都写入一个单独的.S源文件,并根据构建的目标使用“gcc”进行选择性编译。我不使用内联汇编程序
x86:

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
;;
;; 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
以下是Windows实现(.asm文件):

x86:

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
;;
;; 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

GCC有一些类似的内置功能:

-内置函数:int\uu内置函数(无符号int x)

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

-内置函数:int\uu内置函数(无符号int x)

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


如果您有零的数量,您应该能够找出第一个1的位置。:-)

从上面的情况看,不清楚索引中返回了什么-什么是“位位置”?你能举例说明你想如何使用这个函数吗