位操作相关宏与函数

这两个宏和那个函数是我从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));
}
时间: 2024-10-30 03:13:36

位操作相关宏与函数的相关文章

MFC 消息映射表 及 相关宏定义

MFC相关技术说明:<可参阅MSDN MFC TNO 5> MFC 中通过通过不同于SDK的switch的方法来处理WINDOWS消息, 由消息映射表(Message Map)和虚函数多态来处理指定的窗体消息   1 声明一个消息映射表(Message Map) 在能处理消息的类中中添加宏 DECLARE_MESSAGE_MAP()   注 深入浅出MFC中有更详尽系统的概述 这里只介绍几个宏定义 这个宏实现了3个功能: 1 私有数据成员声明 AFX_MESSAGEMAP_ENTRY _mes

MFC中常用类、宏、函数的简单介绍

闲来无事,整理了一下MFC中常用的类.宏.函数. 常用类 CRect:用来表示矩形的类,拥有四个成员变量:top left bottom right.分别表是左上角和右下角的坐标.可以通过以下的方法构造: CRect( int l, int t, int r, int b ); 指明四个坐标 CRect( const RECT& srcRect ); 由RECT结构构造 CRect( LPCRECT lpSrcRect ); 由RECT结构构造 CRect( POINT point, SIZE

C语言中socket相关网络编程函数小结_C 语言

C语言socket()函数:建立一个socket通信头文件: #include <sys/types.h> #include <sys/socket.h> 定义函数: int socket(int domain, int type, int protocol); 函数说明:socket()用来建立一个新的socket, 也就是向系统注册, 通知系统建立一通信端口. 参数domain 指定使用何种的地址类型, 完整的定义在/usr/include/bits/socket.h 内, 底

[MySQL 学习] zlib库相关结构和函数

以下主要是阅读zlib库时,对库函数的注释的翻译,也是为了帮助理解zlib在innodb压缩表中的应用 这里只考虑了Innodb用到的函数,其他的具体参考zlib.h文件,里面的注释写的非常详细 --------- 1.主要用到的结构体是z_stream,定义在文件zlib/zlib.h中,我们需要去定义的字段包括 Bytef    *next_in 输入的源字符串 uInt     avail_in 输入源字符串长度,当avail_in下降到0时,必须更新next_in和avail_in By

JS 一套COOKIE相关的操作函数

  //检测浏览器是否支持Cookie function checkCookie(){  //判断cookie是否开启  var cookieEnabled=(navigator.cookieEnabled)? true : false;  //如果浏览器不是ie4+或ns6+  if (typeof navigator.cookieEnabled=="undefined" && !cookieEnabled){   document.cookie="test

深入探讨:宏、内联函数与普通函数的区别_C 语言

内联函数的执行过程与带参数宏定义很相似,但参数的处理不同.带参数的宏定义并不对参数进行运算,而是直接替换:内联函数首先是函数,这就意味着函数的很多性质都适用于内联函数,即内联函数先把参数表达式进行运算求值,然后把表达式的值传递给形式参数.    内联函数与带参数宏定义的另一个区别是,内联函数的参数类型和返回值类型在声明中都有明确的指定:而带参数宏定义的参数没有类型的概念,只有在宏展开以后,才由编译器检查语法,这就存在很多的安全隐患.    使用内联函数时,应注意以下问题:    1)内联函数的定

C语言中的内联函数(inline)与宏定义(#define)详细解析_C 语言

先简明扼要,说下关键:1.内联函数在可读性方面与函数是相同的,而在编译时是将函数直接嵌入调用程序的主体,省去了调用/返回指令,这样在运行时速度更快. 2.内联函数可以调试,而宏定义是不可以调试的.内联函数与宏本质上是两个不同的概念如果程序编写者对于既要求快速,又要求可读的情况下,则应该将函数冠以inline.下面详细介绍一下探讨一下内联函数与宏定义. 一.内联函数是什么?内联函数是代码被插入到调用者代码处的函数.如同 #define 宏(但并不等同,原因见下文),内联函数通过避免被调用的开销来提

IO端口和IO内存的区别及分别使用的函数接口

每个外设都是通过读写其寄存器来控制的.外设寄存器也称为I/O端口,通常包括:控制寄存器.状态寄存器和数据寄存器三大类.根据访问外设寄存器的不同方式,可以把CPU分成两大类.一类CPU(如M68K,Power PC等)把这些寄存器看作内存的一部分,寄存器参与内存统一编址,访问寄存器就通过访问一般的内存指令进行,所以,这种CPU没有专门用于设备I/O的指令.这就是所谓的"I/O内存"方式.另一类CPU(典型的如X86),将外设的寄存器看成一个独立的地址空间,所以访问内存的指令不能用来访问这

Unix编程之ioctl函数详解

我这里说的ioctl函数是指驱动程序里的,因为我不知道还有没有别的场合用到了它,所以就规定了我们讨论的范围.写这篇文章是因为我前一阵子被ioctl给搞混了,这几天才弄明白它,于是在这里清理一下头脑. 一. 什么是ioctl ioctl是设备驱动程序中对设备的I/O通道进行管理的函数.所谓对I/O通道进行管理,就是对设备的一些特性进行控制,例如串口的传输波特率.马达的转速等等.它的调用个数如下: int ioctl(int fd, ind cmd, -): 其中fd是用户程序打开设备时使用open