单片机位运算操作
学习单片机软件的时候难免会设计修改某一位,例如给a寄存器的第3位置1,或者清零。在写位时,要注意不能修改其他位,因为每一位都有自己的作用。下面就说一下具体怎么操作:
先说一下口诀:清零 & (与)零, 置位 |(或)一 , 取反用 ~ ;
下面通过具体的栗子来学习一下:(以32为例)
1. 给定一个整数a , 设置a的bit3 , 保证其他位不变。
a = a | (0b1000) ;
a |= (1 << 3) ;
更好的形式是 a |= (1 << 3) ;
2. 给定一个整数a , 设置a的bit3~bit7 , 保证其他位不变。
a = a | (0b1111 1000) ;
a |= (0x1f << 3)
更好的形式是 a |= (0b11111 << 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)) ;
--------------------- 

 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号