免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1035 | 回复: 0
打印 上一主题 下一主题

理解bitops中的__set_bit及其应用 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-09-04 17:27 |只看该作者 |倒序浏览


在include\linux\bitops.h中对比特位操作的API中: bit 0 is the LSB of addr; bit 32 is the LSB of (addr+1).
如何来理解下面的代码呢?
// Note: nr为要设置的比特位(可以是0或者更大的值),addr为位图的起始地址
void __set_bit(int nr, volatile unsigned long *addr)
{
    unsigned long mask = 1 > 5);
    *p |= mask;
}
由于0x1f(16进制) = 0001 1111(二进制) = 31(十进制),
因而将上述代码翻译为下面的代码,则更为清晰一些:
void __set_bit(int nr, volatile unsigned long *addr)
{
    addr[nr >> 5] |= (1UL >5 即nr/32,那么下面的代码就更加清晰了:
    addr[nr/32] |= (1UL bitmap)就是查找bitmap中第一个为1的位,那么就可以获取当前优先级最高的进程队列。
2  Linux中输入子系统中bitops的应用
   struct input_dev {
    void *private;
    const char *name;
    const char *phys;
    const char *uniq;
    struct input_id id;
    /*
     * 根据各种输入信号的类型来建立类型为unsigned long 的数组,     * 数组的每1bit代表一种信号类型,     * 内核中会对其进行置位或清位操作来表示事件的发生和被处理.
     */
    unsigned long evbit[NBITS(EV_MAX)];
    unsigned long keybit[NBITS(KEY_MAX)];
    unsigned long relbit[NBITS(REL_MAX)];
    unsigned long absbit[NBITS(ABS_MAX)];
    unsigned long mscbit[NBITS(MSC_MAX)];
    unsigned long ledbit[NBITS(LED_MAX)];
    unsigned long sndbit[NBITS(SND_MAX)];
    unsigned long ffbit[NBITS(FF_MAX)];
    unsigned long swbit[NBITS(SW_MAX)];
    .........................................
};
3. Port中bitops的应用
4. VLAN(1-4094)中bitops的应用

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/28535/showart_1164637.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP