C++ 如何实现MS特定的_BitScanReverse()函数?
来自MSDN 从最高有效位(MSB)到最低有效位(LSB)搜索掩码数据以查找设置位(1) 无符号字符\u位扫描反向 ( 无符号长*索引, 无符号长掩码 );强> 参数 [out]索引 加载找到的第一个设置位(1)的位位置 [在]面具 要搜索的32位或64位值 返回值 如果掩码为零,则为0;否则为非零 备注 如果找到设定位,则在第一个参数中返回找到的第一个设定位的位位置。如果未找到设置位,则返回0;否则,返回1C++ 如何实现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()功能?我必须
请告诉我如何在OS X上实现安全快速的\u BitScanReverse()功能?我必须使用汇编还是有更简单的方法?下面的代码是我不久前为Linux编写的—它可以找到最高的集合位,我想这正是您所要求的。它不符合您的具体规格,但应易于适应 进一步说明:
- 返回0表示设置了位-0;如果未找到位,则返回64
- 这个汇编程序是为Linux下GCC使用的调用约定编写的。我不知道这在MacOSX下有什么不同-你需要检查一下
- 输入为64位无符号整数
- 每个CPU体系结构都写入一个单独的.S源文件,并根据构建的目标使用“gcc”进行选择性编译。我不使用内联汇编程序
/*
* 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的位置。:-) 从上面的情况看,不清楚索引中返回了什么-什么是“位位置”?你能举例说明你想如何使用这个函数吗