在 C 語言中,位運算是對二進位制位進行的操作。以下是關於 C 語言位運算的介紹:
一、常見的位運算子
-
按位與(&):
- 規則:兩個對應的二進位制位都為 1 時,結果位為 1,否則為 0。
- 例如:5(二進位制為 0101)與 3(二進位制為 0011)進行按位與運算,結果為 0001,即 1。
-
按位或(|):
- 規則:兩個對應的二進位制位只要有一個為 1 時,結果位為 1,否則為 0。
- 例如:5(二進位制為 0101)與 3(二進位制為 0011)進行按位或運算,結果為 0111,即 7。
-
按位異或(^):
- 規則:兩個對應的二進位制位不同時,結果位為 1,相同時為 0。
- 例如:5(二進位制為 0101)與 3(二進位制為 0011)進行按位異或運算,結果為 0110,即 6。
-
取反(~):
- 規則:將二進位制位的每一位取反,即 0 變為 1,1 變為 0。
- 例如:~5(二進位制為 0101),結果為 1010,即按位取反後為 -6(在有符號整數中,最高位為 1 表示負數)。
-
左移(<<):
- 規則:將一個數的二進位制表示向左移動指定的位數,右邊用 0 填充。
- 例如:5(二進位制為 0101)左移 2 位,結果為 20(二進位制為 10100)。
-
右移(>>):
- 規則:對於有符號數,將一個數的二進位制表示向右移動指定的位數,左邊用符號位填充;對於無符號數,左邊用 0 填充。
- 例如:5(二進位制為 0101)右移 2 位,結果為 1(二進位制為 0001)。
二、位運算的應用場景
-
高效的標誌位處理:
- 可以用一個整數的不同位來表示不同的標誌狀態。例如,可以用一個位元組來表示 8 個不同的開關狀態,透過位運算來設定、清除和檢查這些標誌位。
- 程式碼示例:
unsigned char flags = 0; // 設定第 3 個標誌位 flags |= (1 << 2); // 檢查第 3 個標誌位是否設定 if (flags & (1 << 2)) { printf("Third flag is set.\n"); } // 清除第 3 個標誌位 flags &= ~(1 << 2);
-
資料的壓縮和編碼:
- 在某些情況下,可以透過位運算來壓縮資料,減少儲存空間的佔用。例如,可以將多個小的整數打包到一個較大的整數中。
- 程式碼示例:
unsigned int packTwoNumbers(unsigned char num1, unsigned char num2) { return (num1 << 8) | num2; }
-
位掩碼操作:
- 可以使用位掩碼來選擇或遮蔽特定的位。例如,要獲取一個整數的低 4 位,可以使用位掩碼 0x0F。
- 程式碼示例:
unsigned int num = 0xABCD; unsigned char lowFourBits = num & 0x0F;
-
快速計算乘除 2 的冪次方:
- 左移一位相當於乘以 2,右移一位相當於除以 2。
- 程式碼示例:
int num = 5; int doubled = num << 1; // 10 int halved = num >> 1; // 2
總之,位運算在 C 語言中是一種強大的工具,可以用於最佳化程式碼、處理特定的資料格式和實現一些特定的演算法。但在使用位運算時,需要小心處理邊界情況和確保程式碼的可讀性。