- 51單片機C語言開發教程
- 劉理云
- 1016字
- 2019-01-04 20:13:40
2.7 位運算
所謂位運算是指進行二進制位的運算。C語言提供如下幾種位運算符:
& 按位與
| 按位或
^ 按位異或
~ 取反
<< 左移
>> 右移
說明:
①位運算符中除“~”以外,均為二目運算符,即要求兩側各有一個運算量。
②運算量只能是整型或字符型的數據。
(1)按位與運算符(&)
參加運算的兩個運算量,如果兩個相應的位都為1,則該位的結果值為1,否則為0,即:
0&0=0;0&1=0;1&0=0;1&1=1
例如:3&5,先把3和5以補碼表示,再進行按位與運算。
它是1的補碼,因此3&5=1。
按位與有一些特殊的用途:
①清零。如果想將一個單元或某一位清零,將其與0進行與運算即可。
②取一個數中某些指定位。如只想要P1口的低4位,只需將P1和0x0f相與即可。
③要想將哪一位保留下來,就與一個數進行與運算,此數在該位取1,其余位取0,例如:有一數01010101,想把其中左面第3、4、5、7、8位保留下來,可以這樣:
(2)按位或運算符(|)
兩個相應位中只要有一個為1,該位的結果值為1。即:
0|0=0;0|1=1;1|0=1;1|1=1
例如:八進制數060|017
按位或運算常用來對一個數據的某些位定值為1。
(3)按位異或運算符(^)
也稱XOR運算符。它的規則是:參加運算的兩個相應位同號,則結果為0;異號則為1。即:
0^0=0; 0^1=1; 1^0=1; 1^1=0
異或運算的應用:
①使特定位翻轉。假設有01111010,想使其低4位翻轉,即1變為0,0變為1。可以將它與00001111進行異或運算。即:
結果值的低4位正好是原數低4位的翻轉。因為任意位與0異或保留原值,與1異或取反,故要使哪幾位翻轉就將與其進行異或運算的數中該幾位為1即可。
②交換兩個值,不用臨時變量。
例:a=3,b=4,想將a和b的值互換,可以用以下賦值語句實現。
a=a^b;
b=b^a;
a=a^b;
可以用豎式來說明:
(4)取反運算符(~)
“~”是一個單目運算符,用來對一個二進制數按位取反,即將0變1,1變0。
例:~025是對八進制數25(0000000000010101)按位取反。
(5)左移運算符(<<)
假設對一個字節進行左移運算,如圖2-12所示:

圖2-12 左移運算
高位左移后溢出,舍棄不起作用,右端低位補0。
“<<”用來將一個數的各二進位全部左移若干位。
例:a=a<<2
將a的二進制數左移2位,右補0。若a=15,即二進制數00001111,左移2位得00111100,即十進制數60。
左移1位相當于該數乘以2,左移2位相當于該數乘以4。但此結論只適用于該數左移時被溢出,舍棄的高位中不包含1的情況。
(6)右移運算符(>>)
假設對一個字節進行右移運算,如圖2-13所示:

圖2-13 右移運算
低位右移后溢出,舍棄不起作用,左端位高補0。
如:a>>2表示將a的各位二進位右移2位。移到右端的低位被舍棄,對無符號數,高位補0。
如:a=017,
右移1位相當于除以2。
在右移時,需要注意符號位問題,對無符號數,右移時左邊高位移入0。對有符號的值,如果原來符號位為0,則左邊也是移入0,如果符號位原來為1,則左邊移入0還是1,要取決于所用的計算機系統。
(7)位運算符與賦值運算符結合
位運算符與賦值運算符結合可以組成擴展的賦值運算符。
如:&=,|=, <<=, >>=, ^=
例:a&=b相當于a=a&b
a<<=2相當于a=a<<2
【例2-18】取一個整數a從右端開始的4~7位。
(8)循環移位
循環移位有循環左移和循環右移,如圖2-14所示。

圖2-14 循環移位
在C程序中,如需循環移位,可加頭文件<intrins.h>,然后調用庫函數_crol_(循環左移)和_cror_(循環右移)。
【例2-19】將P1口循環左移2位。
- Building Modern Web Applications Using Angular
- 深入淺出Spring Boot 2.x
- Python語言程序設計
- Data Analysis with IBM SPSS Statistics
- Windows Server 2012 Unified Remote Access Planning and Deployment
- Symfony2 Essentials
- RSpec Essentials
- 精通Python自動化編程
- 輕松上手2D游戲開發:Unity入門
- 零代碼實戰:企業級應用搭建與案例詳解
- Emotional Intelligence for IT Professionals
- UML軟件建模
- WCF技術剖析(卷1)
- Beginning C# 7 Hands-On:The Core Language
- Spring Boot從入門到實戰