linux 位操作c语言

来源:互联网 发布:instsee新域名 编辑:程序博客网 时间:2024/06/07 03:01

Linux 内核 bitops 非原子操作实现。


static inline void set_bit(int bit, volatile unsigned long *addr){  unsigned long mask = BIT_MASK(bit);  unsigned long *p = ((unsigned long *)addr) + BIT_WORD(bit);  *p |= mask;}static inline void clear_bit(unsigned int bit, volatile unsigned long *addr){  unsigned long mask = BIT_MASK(bit);  unsigned long *p = ((unsigned long *)addr) + BIT_WORD(bit);  *p &= ~mask;}static inline void change_bit(unsigned int bit, volatile unsigned long *addr){  unsigned long mask = BIT_MASK(bit);  unsigned long *p = ((unsigned long *)addr) + BIT_WORD(bit);  *p ^= mask;}static inline inttest_and_set_bit(unsigned int bit, volatile unsigned long *addr){  unsigned int res;  unsigned long mask = BIT_MASK(bit);  unsigned long *p = ((unsigned long *)addr) + BIT_WORD(bit);  res = *p;  *p = res | mask;  return (res & mask) != 0;}static inline inttest_and_clear_bit(unsigned int bit, volatile unsigned long *addr){  unsigned int res;  unsigned long mask = BIT_MASK(bit);  unsigned long *p = ((unsigned long *)addr) + BIT_WORD(bit);  res = *p;  *p = res & ~mask;  return (res & mask) != 0;}static inline inttest_and_change_bit(unsigned int bit, volatile unsigned long *addr){  unsigned int res;  unsigned long mask = BIT_MASK(bit);  unsigned long *p = ((unsigned long *)addr) + BIT_WORD(bit);  res = *p;  *p = res ^ mask;  return (res & mask) != 0;}


0 0
原创粉丝点击