位操作相关宏与函数

这两个宏和那个函数是我从linux内核中截取出来的,在GCC编译器下(Dev 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\n\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\n\t setnb %%al"\
            :"=a"(res):"0"(0),"r"(nr),"m"(*(addr)));\
            res;})

后面这几个是我模仿内核来写的两个以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));       
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值