學習單片機軟件的時候難免會設計修改某一位,例如給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)) ;
---------------------
