__fls 源码分析


__fls 用于找到一个long型数最后哪个bit为1,例如0x1010的话,__fls 就返回12,表示最高为是第12bit
源码分析如下:

static __always_inline unsigned long __fls(unsigned long word)
{
    int num = BITS_PER_LONG - 1;

#if BITS_PER_LONG == 64
    if (!(word & (~0ul << 32))) {
        num -= 32;
        word <<= 32;
    }
#endif
    if (!(word & (~0ul << (BITS_PER_LONG-16)))) {
        num -= 16;
        word <<= 16;
    }
    if (!(word & (~0ul << (BITS_PER_LONG-8)))) {
        num -= 8;
        word <<= 8;
    }
    if (!(word & (~0ul << (BITS_PER_LONG-4)))) {
        num -= 4;
        word <<= 4;
    }
    if (!(word & (~0ul << (BITS_PER_LONG-2)))) {
        num -= 2;
        word <<= 2;
    }
    if (!(word & (~0ul << (BITS_PER_LONG-1))))
        num -= 1;
    return num;
}
假定BITS_PER_LONG ==32
则~0ul ==0xFFFFFFFF
第一步:!(word & (~0ul << (BITS_PER_LONG-16))) =!(0x1010 & 0xFFFF0000)=1,则num -=16=15.word = 0x1010 0000
第二步:!(word & (~0ul << (BITS_PER_LONG-8))) =!(0x1010 & 0xFF000000)=0,则num=15.word = 0x1010 0000
第三步:!(word & (~0ul << (BITS_PER_LONG-4))) =!(0x1010 & 0xc0000000)=0,则num=15.word = 0xf0000000
第三步:!(word & (~0ul << (BITS_PER_LONG-2))) =!(0x1010 & 0xc0000000)=1,则num=13.word = 0x40400000
第四步:!(word & (~0ul << (BITS_PER_LONG-2))) =!(0x1010 & 0x80000000)=1,则num=12.word = 0x40400000
所以最终返回12
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值