1. 程式人生 > 實用技巧 >計算機中的原始碼、反碼、補碼。

計算機中的原始碼、反碼、補碼。

首先,我們先看一段程式碼:

public class TestDemo02 {
    public static void main(String[] args) {
        int num1 = 4;
        int num2 = -4;
        System.out.println(Integer.toBinaryString(num1));
        System.out.println(Integer.toBinaryString(num2));
    }
}

這段程式碼是要列印num1和num2的二進位制表示,我們看下結果:

4很理解,100 = 1*2^2+0*2^1+0*2^0=4,但是-4 為什麼是11111111111111111111111111111100來表示??

這裡,我們就需要了解計算機中資料是如何儲存的。

一、基本定義

在計算機系統中,數值一律用補碼來表示和儲存。原因在於,使用補碼,可以將符號位和數值域統一處理;同時,加法和減法也可以用補碼統一處理。此外,補碼與原碼相互轉換,其運算過程是相同的,不需要額外的硬體電路。

  1. 原碼:二進位制表示。二進位制首位是符號位,0為正,1為負
  2. 反碼正數,反碼和原碼一樣;負數,符號位不變,其他各位取反
  3. 補碼正數,補碼和原碼一樣;負數,反碼末位加1,有進位則進位,但不改變符號

按照這個定義,我們看下-4是怎麼表示的。

-4的原碼,符號位為1表示負數

10000000 00000000 00000000 00000100

-4的反碼,符號位不變,其他各位取反

11111111 11111111 11111111 11111011

-4的補碼,反碼的末位加1,符號位不變

11111111 11111111 11111111 11111100

所以,我們看到跟java 執行輸出的結果是一致的。

二、負數的位運算

正數的原碼、反碼、補碼都一樣,直接運算即可,負數的位運算需要轉換成補碼運算後再轉成原碼。

例如:

-4<<2

① -4的原碼,符號位為1表示負數

10000000 00000000 00000000 00000100

② -4的反碼,符號位不變,其他各位取反

11111111 11111111 11111111 11111011

③ -4的補碼,反碼的末位加1,符號位不變

11111111 11111111 11111111 11111100

④對補碼進行左移兩位(最高位不變,次高兩位去掉,末尾兩位補0)

11111111 11111111 11111111 11110000

⑤取反碼,-1

11111111 11111111 11111111 11101111

⑥原碼,最高位不變,其他位去反

10000000 00000000 00000000 00010000

換算成十進位制就是-16.

我們用程式驗證下:

public class TestDemo02 {
    public static void main(String[] args) {
        int num2 = -4;
        System.out.println(num2<<2);
    }
}

輸出結果:

因此,總結下,涉及到負數的位運算,計算過程:

擴充套件閱讀:為什麼需要反碼?

https://blog.csdn.net/chenchao2017/article/details/79733278