ビット操作関連マクロと関数
1226 ワード
この2つのマクロとその関数は私がlinuxカーネルから切り取ったもので、GCCコンパイラの下(DevC+)コンパイラの下でコンパイラしました.
後のいくつかは私がカーネルを真似て書いた2つのCで実現されたプログラムで、比較的理解しやすいです.
static inline int test_bit(int nr , const volatile void *addr) // , addr nr 0 1
{
return 1 & (((const volatile unsigned int *)addr)[nr >> 5 ] >> (nr & 31)) ;
}
// , addr nr 1
#define set_bit(nr,addr) ({\
register int res;\
__asm__ __volatile__("btsl %2,%3
\t setb %%al"\
:"=a"(res) :"0" (0),"r"(nr),"m"(*(addr)));\
res;})
// , addr nr 0
#define clear_bit(nr,addr) ({\
register int res;\
__asm__ __volatile__("btrl %2,%3
\t setnb %%al"\
:"=a"(res):"0"(0),"r"(nr),"m"(*(addr)));\
res;})
後のいくつかは私がカーネルを真似て書いた2つのCで実現されたプログラムで、比較的理解しやすいです.
static inline int __set_bit(int nr, const volatile void *addr)
{
unsigned long *add = (unsigned long *)addr ;
return add[nr/32] |= (1UL << (nr % 32));
}
static inline int __clr_bit(int nr , const volatile void *addr)
{
unsigned long *add = (unsigned long *)addr ;
return add[nr/32] &= ~(1UL << (nr %32));
}