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

 

位操作

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为要加权的字
一个数的加权平衡是这个数所有位的总和。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值