C語言中的位運算子



C語言中的位運算子允許對儲存在計算機記憶體中的資料進行低階操作。

C語言中的位運算子與邏輯運算子形成對比。例如,邏輯與運算子(&&)對兩個布林表示式執行與運算,而位與運算子(&)對兩個運算元的每個對應位執行與運算。

對於三個邏輯運算子&&||!,C語言中對應的位運算子分別為&|~

此外,符號^(異或)、<<(左移)和>>(右移)是其他位運算子。

運算子 描述 示例
& 二進位制與運算子如果位在兩個運算元中都存在,則將其複製到結果中。 (A & B)
| 二進位制或運算子如果位在任一運算元中存在,則將其複製。 (A | B)
^ 二進位制異或運算子如果位在一個運算元中設定,但在另一個運算元中沒有設定,則將其複製。 (A ^ B)
~ 二進位制一補碼運算子是一元運算子,其作用是“翻轉”位。 (~A
<< 二進位制左移運算子。左運算元的值向左移動右運算元指定的位數。 A << 2
>> 二進位制右移運算子。左運算元的值向右移動右運算元指定的位數。 A >> 2

儘管這些運算子作用於單個位,但它們需要運算元以C資料型別或變數的形式出現,因為變數在記憶體中佔用特定數量的位元組。

C語言中的位與運算子 (&)

位與 (&) 運算子根據以下真值表執行操作:

位 a 位 b a & b
0 0 0
0 1 0
1 0 0
1 1 1

位二進位制與對數字在其二進位制形式中每個位置的位執行邏輯運算。

假設兩個int變數“a”和“b”的值分別為60(在二進位制中相當於0011 1100)和13(在二進位制中相當於0000 1101),則“a & b”操作的結果為13,根據其對應位的位與運算,如下所示:

  0011 1100  
& 0000 1101 
  --------- 
= 0000 1100 

二進位制數00001100對應十進位制數12。

位或 (|) 運算子

位或 (|) 運算子根據以下真值表執行操作:

位 a 位 b a | b
0 0 0
0 1 1
1 0 1
1 1 1

位二進位制或對數字在其二進位制形式中每個位置的位執行邏輯運算。

假設兩個int變數“a”和“b”的值分別為60(在二進位制中相當於0011 1100)和13(在二進位制中相當於0000 1101),則“a | b”的結果為61,根據其對應位的位或運算,如下所示:

  0011 1100   
| 0000 1101  
  --------- 
= 0011 1101

二進位制數00111101對應十進位制數61。

位異或 (^) 運算子

位異或 (^) 運算子根據以下真值表執行操作:

位 a 位 b a ^ b
0 0 0
0 1 1
1 0 1
1 1 0

位二進位制異或對數字在其二進位制形式中每個位置的位執行邏輯運算。異或運算稱為“互斥或”。

注意:僅當一個運算元為1時,異或的結果才為1。與或不同,如果兩個位都為1,則異或的結果為0。

假設兩個int變數“a”和“b”的值分別為60(在二進位制中相當於0011 1100)和13(在二進位制中相當於0000 1101),則“a ^ b”操作的結果為49,根據其對應位的位異或運算,如下所示:

  0011 1100   
^ 0000 1101  
  --------- 
= 0011 0001

二進位制數00110001對應十進位制數49。

左移 (<<) 運算子

左移運算子用<<符號表示。它將左運算元中的每個位向左移動右運算元指示的位數。移位時產生的任何空白都將用零填充。

假設int變數“a”的值為60(在二進位制中相當於0011 1100),則“a << 2”操作的結果為240,根據其對應位的位左移運算,如下所示:

0011 1100 << 2 = 1111 0000

二進位制數11110000對應十進位制數240。

右移 (>>) 運算子

右移運算子用>>符號表示。它將左運算元中的每個位向右移動右運算元指示的位數。移位時產生的任何空白都將用零填充。

假設int變數a的值為60(在二進位制中相當於0011 1100),則“a >> 2”操作的結果為15,根據其對應位的位右移運算,如下所示:

0011 1100 >> 2 = 0000 1111

二進位制數00001111對應十進位制數15。

一補碼 (~) 運算子

C語言中的一補碼運算子 (~) 是一元運算子,只需要一個運算元。它具有“翻轉”位的作用,這意味著1將替換為0,反之亦然。

a ~a
0 1
1 0

假設int變數“a”的值為60(在二進位制中相當於0011 1100),則“~a”操作的結果為以二進位制補碼形式表示的-61,根據其對應位的位右移運算,如下所示:

~ 0011 1100 = 1100 0011

二進位制數1100 0011對應十進位制數-61。

示例

在本例中,我們重點介紹了所有位運算子的操作。

#include <stdio.h>

int main(){

   unsigned int a = 60;	/* 60 = 0011 1100 */  
   unsigned int b = 13;	/* 13 = 0000 1101 */
   int c = 0;           

   c = a & b;       /* 12 = 0000 1100 */ 
   printf("Line 1 - Value of c is %d\n", c );

   c = a | b;       /* 61 = 0011 1101 */
   printf("Line 2 - Value of c is %d\n", c );

   c = a ^ b;       /* 49 = 0011 0001 */
   printf("Line 3 - Value of c is %d\n", c );

   c = ~a;          /*-61 = 1100 0011 */
   printf("Line 4 - Value of c is %d\n", c );

   c = a << 2;     /* 240 = 1111 0000 */
   printf("Line 5 - Value of c is %d\n", c );

   c = a >> 2;     /* 15 = 0000 1111 */
   printf("Line 6 - Value of c is %d\n", c );
   
   return 0;
}

輸出

執行此程式碼時,將產生以下輸出:

Line 1 - Value of c is 12
Line 2 - Value of c is 61
Line 3 - Value of c is 49
Line 4 - Value of c is -61
Line 5 - Value of c is 240
Line 6 - Value of c is 15
c_operators.htm
廣告