官术网_书友最值得收藏!

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】輸出包含位運算擴展賦值運算符的表達式的值。

程序如下:

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

主站蜘蛛池模板: 连城县| 拉萨市| 遵义县| 沅江市| 拉萨市| 赤城县| 青川县| 岢岚县| 日照市| 措美县| 安新县| 乌兰察布市| 武山县| 玉田县| 桓仁| 沿河| 延边| 芷江| 丁青县| 普陀区| 桦甸市| 西乌珠穆沁旗| 扎囊县| 丰都县| 桃源县| 闸北区| 油尖旺区| 时尚| 大新县| 吉安县| 济阳县| 全椒县| 新和县| 中江县| 稻城县| 苏州市| 平罗县| 丹阳市| 新龙县| 射阳县| 衡南县|