set_bit() 等位函数分析! \linux-1.0\linux\include\asm\bitops.h

来源:互联网 发布:网络平台是干什么的 编辑:程序博客网 时间:2024/06/07 05:24
//将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);  }  

原创粉丝点击