尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

【c语言】1.3 嵌入式中的位运算

【c语言】1.3 嵌入式中的位运算 基础 逻辑与 位与 逻辑反 位取反^ 位异或c语言中的移位取决于数据类型无符号左移时右侧补0……有符号左移时右侧补0有符号右移时左侧补符号位嵌入式中研究的移位以及使用的移位都是无符号数算术与逻辑算术左移同逻辑左移算术右移移入的位用符号位填逻辑右移移入的位用0填特定位 清零 用 清零位为0其他位为1特定位 置1 用 置1位为1其他位为0特定位 置反 用 ^取反位为1其他位为0关于构建那个特定的二进制数1.用工具2.用移位的方法例bit3-bit7为1 先写出全部1 0xf1后左移3位例bit3-bit7为1bit23-bit25为1分两部分(0x1f3) | (0x723)例bit4-bit10为0其余位为1还是以1为目标这里面的0把1分成了2个部分 0xf | (0x1fffff11)也可以用取反操作来简化。实践1.设置整型数a的bit3其他位不变注意 设置就是置1清除是置0a | (13);2.设置整型数a的bit3-bit7, 其他位保持不变a | (0x1f3)3.清除整型数a的bit15保证其他位不变a (~(115));4.清除整型a的bit15-bit23其他位保持不变a (~(1ff15))5.取出整型数a的bit3-bit8先清零除了bit3-bit8的其他位再右移3位 a ( 0x3f3); a 3;6.用c语言将一个寄存器的bit7-bit17赋值937其他位不受影响先将bit7-bit17全部清零再把937赋值 a (~(0x7ff7); a | (9377)7.用c语言将一个寄存器的bit7-bit17加17其余位不受影响先读出来加上17将bit7-17清零最后再写进去。定义一个临时变量Tmp, Tmp a (0x7ff7); tmp 7; //取出来 tmp17; //加上17 a (~(0x7ff7)); a | tmp;用宏定义来完成位运算1、直接用宏来置位、复位最右边为第1位#define SET_BIT_N(x, n) (x | ((1U)(n-1))) //置位x的第n位注意其中的U表示无符号#define CLEAR_BIT_N(x, n) (x ~((1U)(n-1))) //复位x的第n位2、截取变量的部分连续位。例如变量0x88, 也就是10001000b若截取第24位则值为100b 4#define GETBITS(x, n, m) ((x ~(~(0U)(m-n1))(n-1)) (n-1))这个题目相当于是要把x的bit(n-1)到bit(m-1)取出来复杂宏怎么分析((x ~(~(0U)(m-n1))(n-1)) (n-1))第一步先分清楚这个复杂宏分为几部分2部分(x ~(~(0U)(m-n1))(n-1)) (n-1)分析为什么要(n-1)相当于是我们4.2.4.5中的第二步第二步继续解析剩下的又分为2部分x ~(~(0U)(m-n1))(n-1)分析为什么要相当于我们4.2.4.5中的第一步第三步继续分析剩下的~ (~(0U)(m-n1)) (n-1)这个分析时要搞清楚第2坨到底应该先左边取反再右边还是先右边再左边取反。解法第一查C语言优先级表第二自己实际写个代码测试。说明这个式子应该是 ~(~(0U)(m-n1)) (n-1) 这就又分为2部分了
返回列表