内核中位运算函数

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

1. set_bit

  1. <span style="font-size:16px;">static __always_inline void  
  2. set_bit(unsigned int nr, volatile unsigned long *addr)  
  3. </span>  

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

2. __set_bit

  1. <span style="font-size:16px;">static __always_inline void  
  2. set_bit(unsigned int nr, volatile unsigned long *addr)  
  3. </span>  

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

3. clear_bit

  1. <span style="font-size:16px;">static __always_inline void  
  2. clear_bit(int nr, volatile unsigned long *addr)  
  3. </span>  

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

4. change_bit

  1. <span style="font-size:16px;">static inline void change_bit(int nr, volatile unsigned long *addr)  
  2. </span>  

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

5. test_and_set_bit

  1. <span style="font-size:16px;">static inline int test_and_set_bit(int nr, volatile unsigned long *addr)  
  2. </span>  

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

6. test_and_clear_bit

  1. <span style="font-size:16px;">static inline int test_and_clear_bit(int nr, volatile unsigned long *addr)  
  2. </span>  

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

7. test_and_change_bit

  1. <span style="font-size:16px;">static inline int test_and_change_bit(int nr, volatile unsigned long *addr)  
  2. </span>  

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

8. test_bit

  1. <span style="font-size:16px;">#define test_bit(nr, addr)            \  
  2.     (__builtin_constant_p((nr))     \  
  3.      ? constant_test_bit((nr), (addr))  \  
  4.      : variable_test_bit((nr), (addr)))  
  5. </span>  

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

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

  1. <span style="font-size:16px;">static __always_inline int constant_test_bit(unsigned int nr, const volatile unsigned long *addr)  
  2. </span>  

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

  1. <span style="font-size:16px;">static inline int variable_test_bit(int nr, volatile const unsigned long *addr)</span>  

9. find_first_zero_bit

[html]  view plain copy print ?
  1. <pre class="cpp" name="code"><span style="font-size:16px;">int find_first_zero_bit (void * addr, unsigned size) </span></pre>  
  2. <pre></pre>  
  3. <p><span style="font-family:Microsoft YaHei"><span style="font-size:16px"><span style="font-family:Microsoft YaHei">       </span>addr为内存区的起始地址,size为要查找的最大长度,返回第一个位为0的位号</span></span></p>  
  4. <p><span style="font-family:Microsoft YaHei"><span style="font-size:16px"><strong>10. find_next_zero_bit</strong> <span style="font-family:Microsoft YaHei"></span></span></span></p>  
  5. <span style="font-family:Microsoft YaHei"></span><pre class="cpp" name="code"><span style="font-size:16px;">int find_next_zero_bit (void * addr, int size, int offset) </span></pre>  
  6. <p><span style="font-size:16px"><span style="font-family:Microsoft YaHei">       </span>addr为内存区的起始地址,size为要查找的最大长度,offset开始搜索的起始位号。</span></p>  
  7. <p><span style="font-family:Microsoft YaHei"><span style="font-size:16px"><strong>11. ffz <br>  
  8. </strong><span style="font-family:Microsoft YaHei">        </span>ffz (x):在字x中搜索第一个0。</span></span></p>  
  9. <p><span style="font-family:Microsoft YaHei"><span style="font-size:16px"><strong>12. ffs <br>  
  10. </strong><span style="font-family:Microsoft YaHei">        </span>ffs (x):<span style="font-family:Microsoft YaHei"> </span>在字x中搜索第一个已设置的位。</span></span></p>  
  11. <p><span style="font-family:Microsoft YaHei"><span style="font-size:16px"><strong>13. hweight32</strong> <br>  
  12. <span style="font-family:Microsoft YaHei">        </span>返回一个N位字的加权平衡值  <br>  
  13. <strong>14. hweight32 ( x)</strong><br>  
  14. <span style="font-family:Microsoft YaHei">        </span>x为要加权的字 ,一个数的加权平衡是这个数所有位的总和。</span></span></p>  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值