位操作相关宏与函数

简介: 这两个宏和那个函数是我从linux内核中截取出来的,在GCC编译器下(Dev C++)编译器下编译通过。static inline int test_bit(int nr , const volatile void *addr) //测试位,测试addr的第nr位为0还是为1{ re...
这两个宏和那个函数是我从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));       
}


目录
相关文章
|
5月前
|
算法 安全 C语言
C语言中的位操作运算符有什么作用
C语言中的位操作运算符有什么作用
48 0
|
5月前
|
编译器 C语言
C语言宏定义(#define定义常量​、#define定义宏​、 带有副作用的宏参数、 宏替换的规则、 宏函数的对比)
C语言宏定义(#define定义常量​、#define定义宏​、 带有副作用的宏参数、 宏替换的规则、 宏函数的对比)
|
4月前
实现offsetof宏以及交换一个整数二进制奇偶位的宏
实现offsetof宏以及交换一个整数二进制奇偶位的宏
20 0
实现offsetof宏以及交换一个整数二进制奇偶位的宏
|
5月前
|
存储 C++
c/c++宏定义(函数)
c/c++宏定义(函数)
|
5月前
|
C语言
详解C语言可变参数列表(stdarg头文件及其定义的宏)
详解C语言可变参数列表(stdarg头文件及其定义的宏)
88 0
|
12月前
|
C语言
C语言的offsetof宏模拟和用宏实现交换奇偶位
C语言的offsetof宏模拟和用宏实现交换奇偶位
|
C++
C++宏 #与##的区别
C++宏 #与##的区别
52 0
|
存储 安全 编译器
【为什么】C++中的宏
【为什么】C++中的宏
121 0
|
算法 C++
你是真的“C”——宏与函数的英雄本色
一、何为宏? 在进行宏和函数的对比时,我们先了解一下什么是宏。 #define 定义宏 #define 机制包括了一个规定,允许把参数替换到文本中,这种实现通常称为宏(macro)或定义宏(define macro)。 下面是宏的申明方式: #define name( parament-list ) stuff 其中的 parament-list 是一个由逗号隔开的符号表,它们可能出现在stuff中
115 0
|
C语言
【C语言】宏实现,计算结构体中某变量相对于首地址的偏移量
【C语言】宏实现,计算结构体中某变量相对于首地址的偏移量
179 0
【C语言】宏实现,计算结构体中某变量相对于首地址的偏移量