您正在寻找 x86 的位扫描指令
__inline__ size_t bsf(size_t input) {
size_t pos;
__asm__ ("bsf %1, %0" : "=r" (pos) : "rm" (input));
return pos;
}
如果使用内联 asm,请确保两者pos
和input
是相同的存储类(2、4 或 8 字节整数类型)。这个内联函数应该没问题。
大多数编译器都有使用这条指令的内在函数,但我知道 MSVC 是唯一一个有直接指令的编译器。
对于最高位设置,请改用bsr
指令,语法相同。
注意:如果输入为 0(未设置位),则结果未定义!
pos
如果输入为 0 ,下面是一个将预定义常量放入的版本:
#define BIT_SCAN_IFZERO 0
__inline__ size_t bsf(size_t input) {
size_t pos, ifzero = BIT_SCAN_IFZERO;
__asm__ ( "bsf %1, %0\n\t"
"cmovz %2, %0"
: "=r" (pos)
: "rm" (input)
, "rm" (ifzero));
return pos;
}
定义BIT_SCAN_IFZERO
为你喜欢的任何东西。如果您想要一个负数,请更改size_t
为ssize_t
(有符号大小类型)