我是靠谱客的博主 敏感心情,最近开发中收集的这篇文章主要介绍linux内核中的位运算,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

        在linux内核中有很多位运算函数,如:set_bit,clear_bit,clear_bit,test_and_set_bit等等。

1. set_bit

static __always_inline void
set_bit(unsigned int nr, volatile unsigned long *addr)

       在起始地址为addr的位图中设置第nr位;是原子操作。

2. __set_bit

static __always_inline void
set_bit(unsigned int nr, volatile unsigned long *addr)

       在起始地址为addr的位图中设置第nr位;非原子操作。

3. clear_bit

static __always_inline void
clear_bit(int nr, volatile unsigned long *addr)

       清除起始地址为addr的位图中的第nr位,改操作是原子操作但不具有加锁功能,若要用于加锁目的,应当调用smp_mb__before_clear_bit 或smp_mb__after_clear_bit函数,以确保任何改变在其他的处理器上是可见的。

4. change_bit

static inline void change_bit(int nr, volatile unsigned long *addr)

       在起始地址为addr的位图中改变第nr位;

5. test_and_set_bit

static inline int test_and_set_bit(int nr, volatile unsigned long *addr)

       在起始地址为addr的位图中设置第nr位;并返回原来的值,原子操作。

6. test_and_clear_bit

static inline int test_and_clear_bit(int nr, volatile unsigned long *addr)

       在起始地址为addr的位图中清除第nr位;并返回原来的值,原子操作。

7. test_and_change_bit

static inline int test_and_change_bit(int nr, volatile unsigned long *addr)

       在起始地址为addr的位图中更改第nr位;并返回原来的值,原子操作。

8. test_bit

#define test_bit(nr, addr)			
	(__builtin_constant_p((nr))		
	 ? constant_test_bit((nr), (addr))	
	 : variable_test_bit((nr), (addr)))

       根据nr是否为编译时常数来调用不同的函数,

       若编译时为常数,则调用constant_test_bit

static __always_inline int constant_test_bit(unsigned int nr, const volatile unsigned long *addr)

       若编译时为非常数,则调用variable_test_bit

static inline int variable_test_bit(int nr, volatile const unsigned long *addr)

9. find_first_zero_bit

int find_first_zero_bit (void * addr, unsigned size) 
 
 

       addr为内存区的起始地址,size为要查找的最大长度,返回第一个位为0的位号

10. find_next_zero_bit 

int find_next_zero_bit (void * addr, int size, int offset) 

       addr为内存区的起始地址,size为要查找的最大长度,offset开始搜索的起始位号。

11. ffz 
        ffz (x):在字x中搜索第一个0。

12. ffs 
        ffs (x): 在字x中搜索第一个已设置的位。

13. hweight32 
        返回一个N位字的加权平衡值  
14. hweight32 ( x)
        x为要加权的字 ,一个数的加权平衡是这个数所有位的总和。

转载于:https://www.cnblogs.com/youngerchina/archive/2011/12/18/5624645.html

最后

以上就是敏感心情为你收集整理的linux内核中的位运算的全部内容,希望文章能够帮你解决linux内核中的位运算所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部