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

  • 相关阅读:
    Script file 'D:Anaconda3Scriptspip-script.py' is not present.
    Python中*args和**kwargs
    Error: [Errno 11001] getaddrinfo failed
    form表单怎么用a标签提交post数据
    解决Pycharm运行卡顿问题
    Ubuntu下安装QQ微信——亲测试有效!
    js文件中发送ajax请求,ulr路径不起作用的解决办法
    django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3
    python中print打印显示颜色
    文件保护
  • 原文地址:https://www.cnblogs.com/youngerchina/p/5624645.html
Copyright © 2020-2023  润新知