单片机位运算操作

2019-04-15 17:33发布

我在看了这个视频(http://edu.51cto.com/lesson/id-67954.html)后,学到了一些知识,自己总结一下: 学习单片机软件的时候难免会设计修改某一位,例如给a寄存器的第3位置1,或者清零。在写位时,要注意不能修改其他位,因为每一位都有自己的作用。下面就说一下具体怎么操作: 先说一下口诀:清零 & (与)零, 置位 |(或)一 , 取反用 ~ ; 下面通过具体的栗子来学习一下:(以32为例) 1. 给定一个整数a , 设置a的bit3 , 保证其他位不变。
a = a | (0b1000) ;
更好的形式是 a |= (1 << 3) ; 2. 给定一个整数a , 设置a的bit3~bit7 , 保证其他位不变。
a = a | (0b1111 1000) ;
更好的形式是 a |= (0b11111 << 3) ; 或 a |= (0x1f << 3) 3. 给定一个整数a , 清除a的bit3 , 保证其他位不变。
a = a & (0b0111) ;
更好的形式是 a &= (~(1 << 3)) ; 4. 给定一个整数a , 清除a的bit3~bit7 , 保证其他位不变。
a = a &(0b0000 0111) ;
更好的形式是 a &= (~(0b11111 << 3)) 或 a &= (~(0x1f << 3)) 5. 给定一个整数a , 取出a的bit3~bit7 。
思想:
(1)将其他位清零
(2)右移3位
代码:
a = (a & (0x1f << 3)) >> 3 ; 6. 给寄存器a的bit3~bit7赋值12
思想:
(1)将bit3~bit7清零
(2)将12左移3位 ,写入a
代码:
a = (a & ~(0x1f << 3)) | (12 << 3) ; 7. 给寄存器a的bit3~bit7加上12
思想:
(1)先取出bit3~bit7
(2)将取出的数加上12
(3)将a的bit3~bit7 清零
(4)将取出的数写入a
代码:
tmp = a | (0x1f << 3) >> 3 ;
tmp += 12 ;
a = a & ~(0x1f << 3) ;
a |= tmp << 3 ; 8. 给寄存器a的bit3~bit7 赋值4和 bit 8 ~ bit 12 赋值7
写法一:(只是简单的重复赋值运算)
a = (a & (~0x1f << 3)) | (4 << 3) ;
a = (a & (~0x1f << 8)) | (7 << 8) ;
写法二:
a &= ~((0x1f << 3) | (0x1f << 8)) ; 升级:用宏定义来完成位运算 (从bit0开始算) 1、置位 置位特定位n: #define SET_NTH_BIT(x, n) ( x | ((1U)<<(n)) ) 置位n到m位: #define SET_BIT_N_TO_M(x,n,m)(x | (~((~0U)<<(m-n+1)))<<(n)) 分析: 第一步:((~0U)<<(m-n+1) ) 产生(m-n)到31 位为 1 的数 第二步:(~((~0U)<<(m-n+1)))产生0~m-n位为1的数 第三步:(~((~0U)<<(m-n+1)))<<(n) 产生 第四步:采用位或,将特定位置为1 2、复位 复位特定位: #define CLEAR_NTH_BIT(x, n) ( x & ~((1U)<<(n)) ) 复位n到m位: #define CLEAR_BIT_N_TO_M(x,n,m) (x & ((~0U)<<(m-n+1))<<(n)) 3、截取变量的部分连续位 #define GETBITS(x, n, m) ((x & ~(~(0U)<<(m-n+1))<<(n)) >> (n) )