内核中的基本C库函数 位操作

 
http://hi.baidu.com/yavacom/blog/item/46c8082902d2bcf7e7cd40d2.html

位操作

set_bit
在位图中原子地设置某一位
void set_bit (int nr, volatile void * addr)
nr为要设置的位,addr为位图的起始地址
这个函数是原子操作,如果不需要原子操作,则调用__set_bit函数,nr可以任意大,位图的大小不限于一个字。

__set_bit
在位图中设置某一位
void __set_bit (int nr, volatile void * addr)
nr为要设置的位,addr为位图的起始地址

clear_bit
在位图中清某一位
void clear_bit (int nr, volatile void * addr)
nr为要清的位,addr为位图的起始地址
该函数是原子操作,但不具有加锁功能,如果要用于加锁目的,应当调用smp_mb__before_clear_bit 或smp_mb__after_clear_bit函数,以确保任何改变在其他的处理器上是可见的。

__change_bit
在位图中改变某一位
void __change_bit (int nr, volatile void * addr)
nr为要设置的位,addr为位图的起始地址。
与change_bit不同,该函数是非原子操作。

change_bit
在位图中改变某一位
void change_bit (int nr, volatile void * addr)
nr为要设置的位,addr为位图的起始地址。

test_and_set_bit
设置某一位并返回该位原来的值
int test_and_set_bit (int nr, volatile void * addr)
nr为要设置的位,addr为位图的起始地址。
该函数是原子操作

__test_and_set_bit
设置某一位并返回该位原来的值  
int __test_and_set_bit (int nr, volatile void * addr)  
nr为要设置的位,addr为位图的起始地址。
该函数是非原子操作,如果这个操作的两个实例发生竞争,则一个成功而另一个失败,因此应当用一个锁来保护对某一位的多个访问。

test_and_clear_bit
清某一位,并返回原来的值
int test_and_clear_bit (int nr, volatile void * addr);
nr为要设置的位,addr为位图的起始地址。
该函数是原子操作
    
__test_and_clear_bit
清某一位,并返回原来的值
int __test_and_clear_bit (int nr, volatile void * addr);
nr为要设置的位,addr为位图的起始地址。
该函数为非原子操作
    

test_and_change_bit
改变某一位并返回该位的新值
int test_and_change_bit (int nr, volatile void * addr)
nr为要设置的位,addr为位图的起始地址。
该函数为原子操作

test_bit
确定某位是否被设置
int test_bit (int nr, const volatile void * addr)
nr为要测试的第几位,addr为位图的起始地址。

find_first_zero_bit
在内存区中查找第一个值为0的位
int find_first_zero_bit (void * addr, unsigned size)
addr为内存区的起始地址,size为要查找的最大长度
返回第一个位为0的位号

find_next_zero_bit
在内存区中查找第一个值为0的位
int find_next_zero_bit (void * addr, int size, int offset)
addr为内存区的起始地址,size为要查找的最大长度,offset开始搜索的起始位号。

ffz
在字中查找第一个0
unsigned long ffz (unsigned long word);
word为要搜索的字。

ffs
查找第一个已设置的位  
int ffs (int x)
x为要搜索的字。
这个函数的定义方式与Libc中的一样。
    
    
hweight32
返回一个N位字的加权平衡值  
hweight32 ( x)
x为要加权的字
一个数的加权平衡是这个数所有位的总和。


你可能感兴趣的:(c,测试)