- 零基礎學C語言程序設計
- 宋娟編著
- 1702字
- 2022-05-06 19:49:53
3.3 位運算
計算機的運算基礎是二進制數的運算。所以在C語言中,也提供關于二進制數的運算符,并將其稱為位運算符。一個字節(byte)由8位(bit)組成,即8bit=1byte。本節將詳細講解各種位運算符的使用。
3.3.1 位邏輯運算

在二進制數運算中,會涉及邏輯處理的運算。在C語言中,位邏輯運算符包括取反運算符(~)、位與運算符(&)、位或運算符(|)、位異或運算符(^)4種,如表3.4所示。
表3.4 位邏輯運算符

1. 取反運算符
取反運算符(~)屬于一目運算符,擁有一個操作數。
取反運算符的語法如下:

取反運算符可以將數值轉換為二進制數后按位取反,即0變為1,1變為0。取反運算如圖3.17所示。

圖3.17 取反運算
【示例3-33】將1進行取反運算并輸出結果。
程序如下:

運行程序,輸出以下內容:

在上面程序中,十進制數1的二進制數為00000001,將這個二進制數取反運算后變為11111110,即十進制-2。
2. 位與運算符
位與運算符(&)屬于二目運算符,擁有兩個操作數。
位與運算符的語法如下:

位與運算符可以將數值轉換為二進制數后按位進行與運算。其運算規則是將兩個二進制數的對應位的值進行比較,如果這兩個對應位的值都為1時,則運算結果為1,否則運算結果為0。位與運算如圖3.18所示。

圖3.18 位與運算
【示例3-34】進行位與運算并輸出結果。
程序如下:

運行程序,輸出以下內容:

在上面程序中,十進制數1的二進制數為01,十進制數2的二進制數為10,將這兩個二進制數按位進行與運算,其結果為二進制數00,即十進制數0,如圖3.19所示。

圖3.19 1&2運算過程
3. 位或運算符
位或運算符(|)屬于二目運算符,擁有兩個操作數。
位或運算符的語法如下:

位或運算符可以將數值轉換為二進制數后按位進行或運算。其運算規則是將兩個二進制數的對應位的值進行比較,如果這兩個對應位的值都為0時,則運算結果為0,否則運算結果為1。位或運算如圖3.20所示。

圖3.20 位或運算
【示例3-35】進行位或運算并輸出結果。
程序如下:

運行程序,輸出以下內容:

在上面程序中,十進制數1的二進制數為01,十進制數2的二進制數為10,將這兩個二進制數按位進行或運算,其結果為二進制數11,即十進制數3,如圖3.21所示。

圖3.21 1|2運算過程
4. 位異或運算符
位異或運算符(^)屬于二目運算符,擁有兩個操作數。
位異或運算符的語法如下:

位異或運算符可以將數值轉換為二進制數后按位進行位異或運算。其運算規則是將兩個二進制數的對應位的值進行比較,如果這兩個對應位的值相同時,則運算結果為0,否則運算結果為1,如圖3.22所示。

圖3.22 位異或運算
【示例3-36】進行位異或運算并輸出結果。
程序如下:

運行程序,輸出以下內容:

在上面程序中,十進制數2的二進制數為10,十進制數3的二進制數為11,將這兩個二進制數按位進行異或運算,其結果為二進制數01,即十進制數1,如圖3.23所示。

圖3.23 2^3運算過程
3.3.2 移位運算

在C語言中,移位運算符包括左移運算符與右移運算符兩種,如表3.5所示。
表3.5 移位運算符

1. 左移運算符
左移運算符(<<)屬于二目運算符,擁有兩個操作數,且操作數1表示要左移的數值,操作數2表示要左移的位數。
左移運算符的語法如下:

左移運算符可以將數值轉換為二進制數后按位進行左移運算。其運算規則是將二進制數向左移動,右側空下的位用0補全。例如,表達式11100100<<4表示將11100100左移4位,結果為01000000,如圖3.24所示。

圖3.24 11100100<<4運算過程
【示例3-37】進行左移運算并輸出結果。
程序如下:

運行程序,輸出以下內容:

在上面程序中,十進制數1的二進制數為00000001,將這個二進制數左移1位后變為00000010,再轉換為十進制數2。
2. 右移運算符
右移運算符(>>)屬于二目運算符,擁有兩個操作數,且操作數1表示要右移的數值,操作數2表示要右移的位數。
右移運算符的語法如下:

右移運算符可以將數值轉換為二進制數后按位進行右移運算。其運算規則是將二進制數向右移動,左側空下的位用0補全。例如,表達式11100100>>4表示將11100100右移4位,結果為00001110,如圖3.25所示。

圖3.25 11100100>>4運算過程
【示例3-38】進行右移運算并輸出結果。
程序如下:

運行程序,輸出以下內容:

在程序中,十進制數4的二進制數為00000100,將這個二進制數右移1位后變為00000010,再轉換為十進制數2。
3.3.3 位運算優先級

當書寫同一個表達式中,如果同時出現多個位運算符,一定要注意運算符優先級。位運算符優先級如圖3.26所示。

圖3.26 位運算優先級
在位運算中,除了取反運算符(~)為右結合的,其他幾個位運算符都為左結合的。
【示例3-39】輸出包含多個位運算符的表達式的值。
程序如下:

運行程序,輸出以下內容:

在上面程序中,表達式的運算順序,如圖3.27所示。

圖3.27 表達式的運算順序
3.3.4 位運算擴展賦值運算

在C語言中,提供了5種位運算擴展賦值運算符,如表3.6所示。位運算擴展賦值運算符是將位運算符與賦值運算符結合使用的。所有的運算擴展賦值運算符都是右結合的。
表3.6 位運算擴展賦值運算符

【示例3-40】輸出包含位運算擴展賦值運算符的表達式的值。
程序如下:

運行程序,輸出以下內容:
