find_next_zero_bit() -- 查找第一个不为0的位_儒雅

导读:


choose_address() --> find_next_zero_bit()
/usr/src/linux-2.6.21.5/arch/i386/lib/bitops.c

int find_next_zero_bit(const unsigned long *addr, int size, int offset)
查询*addr中,从第offset位开始,第一个不为0的位的位数(最低位从0开始),注: offset最小值为0,最大值为sizeof(unsigned long)*8 - 1
---------------------------------------------------------------
int find_next_zero_bit(const unsigned long *addr, int size, int offset)
{
    unsigned long * p = ((unsigned long *) addr) + (offset >> 5);
    int set = 0, bit = offset & 31, res;
    if (bit) {
        __asm__("bsfl %1,%0/n/t"
            "jne 1f/n/t"
            "movl $32, %0/n"
            "1:"
            : "=r" (set)
            : "r" (~(*p >> bit)));
        if (set < (32 - bit))
            return set + offset;
        set = 32 - bit;
        p++;
    }
    res = find_first_zero_bit (p, size - 32 * (p - (unsigned long *) addr));
    return (offset + set + res);
}




例如查找位图bitmap(共32位)的第5位开始第一个不为0的位的位数(查询结果为5)
--5   4   3   2   1   0
|---|---|---|---|---|---|
| 0 | 1 | 1 | 1 | 1 | 1 |           
|---|---|---|---|---|---|  

bitmap = 31 = 011111
---------------------------------------------------------------
#include //Needed by all modules
#include //Needed for KERN_ALERT

int init_module(void)
{
    int devnum;
    unsigned long bitmap = 31;
    devnum = find_next_zero_bit(&bitmap, 32, 5);
    printk("<1> devnum = %d/n", devnum);
    return 0;
}

void cleanup_module(void)
{
    printk(KERN_ALERT "Goodbye./n");
}



本文转自
http://hi.baidu.com/zengzhaonong/blog/item/12bf9894ebbfda1cd31b7064.html
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值