问题描述
|
从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