设置32bit数的位域
2011-11-27 08:30
253 查看
操作寄存器的时候,经常需要获取或设置寄存器某些bit的值,为了方便,可以定义如下的宏
方法1:
方法2:
使用宏而不是函数的原因是函数有额外的开销;
扩展一下,使之可以操作64bit数
方法1:
#define GETBITFIELD(ulRegVal, ulOffset, ulBitWidth) \ (((ulRegVal)>>(ulOffset)) & ((1UL << (ulBitWidth)) - 1)) #define SETBITFIELD(ulRegVal, ulOffset, ulBitWidth, ulChangeVal) \ ((ulRegVal) & (~(((1UL << (ulBitWidth))-1) << ulOffset)) \ | (((ulChangeVal)&((1UL << (ulBitWidth)) - 1))<<(ulOffset)))
方法2:
#define GETPOS(ulField) ((unsigned short)(ulField)>>8) #define GETWIDTH(ulField) ((unsigned short)(ulField) & 0xff) #define GETBITFIELD(ulRegVal, ulField) \ ( ((ulRegVal) >> GETPOS(ulField)) & (0xffffffff >> 32-GETWIDTH(ulField)) ) #define SETBITFIELD(ulRegVal, ulField, ulChangeVal) \ (((ulRegVal) & ~((0xffffffff >> 32-GETWIDTH(ulField)) << GETPOS(ulField))) \ | ( ((ulChangeVal) & (0xffffffff >> 32-GETWIDTH(ulField))) << GETPOS(ulField) )) /************************************************************************/ /* 使用方式;要自己保证传入的正确性 */ /************************************************************************/ unsigned int n = 0xffff; printf("\r\n0x%x", GETBITFIELD(n, ((1<<8) | 3))); n = SETBITFIELD(n, ((4<<8) | 1), 0); n = SETBITFIELD(n, ((5<<8) | 2), 2); printf("\r\n0x%x", n);
使用宏而不是函数的原因是函数有额外的开销;
扩展一下,使之可以操作64bit数
#define GETBITFIELD64(RegVal, ulField) \ ( ((RegVal) >> GETPOS(ulField)) & ((unsigned __int64)(-1) >> 64-GETWIDTH(ulField)) ) #define SETBITFIELD64(RegVal, ulField, ChangeVal) \ (((RegVal) & ~(((unsigned __int64)(-1) >> 64-GETWIDTH(ulField)) << GETPOS(ulField))) \ | ( ((ChangeVal) & ((unsigned __int64)(-1) >> 64-GETWIDTH(ulField))) << GETPOS(ulField) ))
相关文章推荐
- 简要分析C中结构的位域成员
- VS2005下源代码管理的VSS2005的登录ID设置
- FC12 FC11 FC10 的XManager telnet ftp 设置,保证绝对有效
- ubunto on virtualbox共享xp文件夹设置
- Access自动编号的初始值设置及重置编号
- 设置 OutLook 2007 帐号收发邮件及修改默认保存邮件位置
- 禁用 windows 2003 Internet Explorer 增强的安全设置
- MySQL中修改密码及访问限制设置详解
- 关于linux环境变量设置
- sql server 2005/2008 设置 sql身份验证 和 sa空密码(像sql2000一样使用)
- ImageView.ScaleType设置图解
- PHP header 请求返回状态值设置(301,404)
- CSS设置一行内文字超过宽度不换行
- Linux环境下手动设置IP地址
- 使用Settings Bundle为程序添加设置项
- Apache虚拟目录设置
- 设置Bundle display name 与 Bundle name 的区别是什么?
- 浏览器全屏显示背景图片设置
- 为hg clone 设置http代理
- Tomcat7.0设置虚拟目录