概念:
原碼:其實就是真實數值的二進制表示方法(只不過根據計算機不同字長表示需要不同個數的0)
比如正整數6在字長爲8的計算機中表示的原碼 0 000 0110 其中第一個數字爲符號位,爲零代表正數,第一個數字爲1則爲負數(-6的原碼就表示爲1 000 0110)
假設是在16字長的計算機中6的原碼就表示爲0 000 0000 0000 0110
反碼:若爲正數則和原碼相同,若爲負數則符號位不變,其它各位取反(若爲1取反就是0,反之亦然)
比如6的反碼爲:0 000 0110
-6的反碼爲: 1 111 1001
補碼:若爲正數則和原碼相同,若爲負數則符號位不變,並將反碼加1(即其它各位取反並將最低位加1)
加減計算:
- 在做補碼加減法時,只需將符號位和數值部分一起參與運算,並且將符號位產生的進位丟掉即可
- 補碼加法公式
[X+Y]補 = [X]補 + [Y]補 - 補碼減法公式
[X-Y]補 = [X]補-[Y]補 = [X]補 + [-Y]補
其中:[-Y]補稱爲負補,求負補的辦法是:對補碼的每一位(包括符號位)求反,且未位加1.
假設字長爲8的計算機byte類型所能表示的最大數是11111111,若再加1稱爲100000000(9位),但因只有8位,最高位1自然丟失。又回了00000000,所以字長爲8的二進制系統的模爲2^8。
加減計算規則參考原文:https://www.jianshu.com/p/abbdae4f3841
移位計算:
左移與右移都先轉換成補碼形式
左移:高位丟棄,低位補零 例:0111 1111 左移兩位得到 1111 1100 從127變成了252
右移:低位丟棄,高位補符號位 例:0111 1111 右移兩位得到 0001 1111 從127變成了31
從補碼再轉回原碼方法:若爲正數(第一位爲0)則補碼與原碼相同,若爲負數(第一位爲1)則對這個數再次取補碼即可
與,或,異或,非運算:
位與( & ):第一個操作數的的第n位於第二個操作數的第n位如果都是1,那麼結果的第n位也爲1,否則爲0
5&3 =1
5轉換爲二進制:0000 0000 0000 0000 0000 0000 0000 0101
3轉換爲二進制:0000 0000 0000 0000 0000 0000 0000 0011
-------------------------------------------------------------------------------------
1轉換爲二進制:0000 0000 0000 0000 0000 0000 0000 0001
位或( | ):第一個操作數的的第n位於第二個操作數的第n位 只要有一個是1,那麼結果的第n位也爲1,否則爲0
5|3 = 7
5轉換爲二進制:0000 0000 0000 0000 0000 0000 0000 0101
3轉換爲二進制:0000 0000 0000 0000 0000 0000 0000 0011
-------------------------------------------------------------------------------------
7轉換爲二進制:0000 0000 0000 0000 0000 0000 0000 0111
位異或( ^ ):第一個操作數的的第n位於第二個操作數的第n位 相反,那麼結果的第n位也爲1,否則爲0
5^3 = 6
5轉換爲二進制:0000 0000 0000 0000 0000 0000 0000 0101
3轉換爲二進制:0000 0000 0000 0000 0000 0000 0000 0011
-------------------------------------------------------------------------------------
6轉換爲二進制:0000 0000 0000 0000 0000 0000 0000 0110
位非( ~ ) :(位非是一元操作符)
~5 = -6
5轉換爲二進制:0000 0000 0000 0000 0000 0000 0000 0101
-------------------------------------------------------------------------------------
-6轉換爲二進制:1111 1111 1111 1111 1111 1111 1111 1010
參考:https://blog.csdn.net/xiaochunyong/article/details/7748713
至於爲何要用補碼做計算,是因爲計算機爲了簡化電路只保留了加法器,現代計算機都以補碼形式存儲數據,而補碼可以讓加減法都使用加法電路實現