ビット操作関連マクロと関数

1226 ワード

この2つのマクロとその関数は私がlinuxカーネルから切り取ったもので、GCCコンパイラの下(DevC+)コンパイラの下でコンパイラしました.
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));       
}