- 论坛徽章:
- 0
|
在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 |
|