test_bit、set_bit和clear_bit

//将addr的第nr(nr为0-31)位置值置为1;  
//nr大于31时,把高27的值做为当前地址的偏移,低5位的值为要置为1的位数  
extern __inline__ int set_bit(int nr,int * addr)  
{  
    int mask, retval;  
  
    addr += nr >> 5;                 //nr大于31时,把高27的值做为当前地址的偏移,  
    mask = 1 << (nr & 0x1f);         //获取31范围内的值,并把1向左偏移该位数  
    cli();                           //关所有中断  
    retval = (mask & *addr) != 0;    //位置置1  
    *addr |= mask;  
    sti();                           //开所有中断  
    return retval;                   //返回置数值  
}  
  
//将addr的第nr(nr为0-31)位置值置为0;  
//nr大于31时,把高27的值做为当前地址的偏移,低5位的值为要置为0的位数;  
extern __inline__ int clear_bit(int nr, int * addr)  
{  
    int mask, retval;  
  
    addr += nr >> 5;  
    mask = 1 << (nr & 0x1f);  
    cli();  
    retval = (mask & *addr) != 0;  
    *addr &= ~mask;  
    sti();  
    return retval;  
}  
  
//判断addr的第nr(nr为0-31)位置的值是否为1;  
//nr大于31时,把高27的值做为当前地址的偏移,低5位的值为要判断的位数;  
extern __inline__ int test_bit(int nr, int * addr)  
{  
    int mask;  
  
    addr += nr >> 5;  
    mask = 1 << (nr & 0x1f);  
    return ((mask & *addr) != 0);  
}  

你可能感兴趣的:(linux)