原碼、反碼、二補數及位元運算符,C語言位元運算詳解

2020-07-16 10:04:22
計算機中的所有資料均是以二進位制形式儲存和處理的。所謂位元運算就是直接把計算機中的二進位制數進行操作,無須進行資料形式的轉換,故處理速度較快。

原碼、反碼和二補數

位(bit)是計算機中處理資料的最小單位,其取值只能是 0 或 1。

位元組(Byte)是計算機處理資料的基本單位,通常系統中一個位元組為 8 位。即:1 Byte=8 bit。

為便於演示,本節表示的原碼、反碼及二補數均預設為 8 位。

準確地說,資料在計算機中是以其二補數形式儲存和運算的。在介紹二補數之前,先了解原碼和反碼的概念。

正數的原碼、反碼、二補數均相同。

原碼:用最高位表示符號位,其餘位表示數值位的編碼稱為原碼。其中,正數的符號位為 0,負數的符號位為 1。

負數的反碼:把原碼的符號位保持不變,數值位逐位取反,即可得原碼的反碼。

負數的二補數:在反碼的基礎上加 1 即得該原碼的二補數。

例如:
+11 的原碼為: 0000 1011
+11 的反碼為: 0000 1011
+11 的二補數為: 0000 1011

-7 的原碼為:1000 0111
-7 的反碼為:1111 1000
-7 的二補數為:1111 1001

注意,對二補數再求一次二補數操作就可得該二補數對應的原碼。

位元運算符

語言中提供了 6 個基本的位元運算符,如表 2 所示。

表 2 C語言運算子
運算子 功 能 運算規則
& 按位元與 對應位均為 1 時,結果才為 1
| 按位元或 兩位中只要有一位為 1,結果為 1。
只有兩位同時為 0 時,結果為才為 0。
^ 按位元互斥或 兩位相異時,結果為 1;兩位相同時,結果為 0。
<< 左移 將運算數的各二進位制位均左移若干位,高位丟棄(不包括 1),低位補 0,每左移一位,相當於該數乘以 2。
>> 右移 將運算數的各二進位制位均右移若干位,正數補左補 0,負數左補 1,右邊移出的位丟棄。
~ 按位元取反 0 變 1,1 變 0。

注意,計算機中位運算操作,均是以二進位制二補數形式進行的。

按位元與(&)

只有兩位同時為 1 時,結果才為 1;只要兩位中有一位為 0,則結果為 0。用式子表示為:

0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1

複合賦值運算子:&= 表示按位元與後賦值。

例如,計算 20 和 9 按位元與的結果,如下所示。