基于4.19.55 内核源码
参数
word
待搜寻非 0 位的整数
返回值
返回第一个非 0 位,全 0 的情况下返回 BITS_PER_LONG - 1
通用版本 __ffs.h, 实现如下:
/**
* __ffs - find first bit in word.
* @word: The word to search
*
* Undefined if no bit exists, so code should check against 0 first.
*/
static __always_inline unsigned long __ffs(unsigned long word)
{
int num = 0;
#if BITS_PER_LONG == 64
if ((word & 0xffffffff) == 0) {
num += 32;
word >>= 32;
}
#endif
if ((word & 0xffff) == 0) {
num += 16;
word >>= 16;
}
if ((word & 0xff) == 0) {
num += 8;
word >>= 8;
}
if ((word & 0xf) == 0) {
num += 4;
word >>= 4;
}
if ((word & 0x3) == 0) {
num += 2;
word >>= 2;
}
if ((word & 0x1) == 0)
num += 1;
return num;
}
x86 版本 bitops.h,通过内联汇编实现(内联汇编知识可以参考 GCC内联汇编基础):
/**
* __ffs - find first set bit in word
* @word: The word to search
*
* Undefined if no bit exists, so code should check against 0 first.
*/
static __always_inline unsigned long __ffs(unsigned long word)
{
asm("rep; bsf %1,%0" /* intel 汇编指令,寻找寄存器 %1 第一个 1 比特位,结果保存到寄存器 %0 */
: "=r" (word) /* 输出操作数 %0 输出到 word */
: "rm" (word)); /* 输入操作数 %1 读取子 word */
return word;
}