目錄總結
整數的二進位制表示,需要區分正整數和負整數來看。
看正整數的二進位制表示,就要先了解一下位權。
十進位制、二進位制都有位權。以 123 為例:123 = 1 * 10^2 + 2 * 10^1 + 3 * 10^0
。每個位置的位權都不一樣,十進位制從右到左,以 1 開始,依次乘 10 。也就是說第 1 位為 1 ,第 2 位為 10,第 3 位為 100。
那麼二進位制怎麼表示 123 呢?二進位制中,每個位置只能有兩個數字:0 和 1。位權的表示和十進位制中的相似,從右到左,以 1 開始,依次乘2。也就是說,第一位是 1,第二位是 2,第三位是 4。那麼十進位制123 用 二進位制表示就為:
0111 1011
它的表示其實是:
0111 1011 = 0 * 2^7 + 1 * 2^6 + 1 * 2^5 + 1* 2^4 + 1 * 2^3 + 0 * 2^2 + 1 ^ 2^1 + 1 * 2^0
負整數的二進位制表示,是對它對應的正整數的二進位制,進行補碼運算:
求 -123 的二進位制表示:
1. 求 123 的二進位制表示:0111 1011
2. 對 1 的結果進行補碼運算(取反加1):1000 0101,這個就是 -123
可以驗證一下 0111 1011 + 1000 0101 的結果是 0000 0000。
負整數的二進位制為什麼要用補碼表示?
因為只有這種形式,計算機才能實現正確的加減法。計算機其實只能做加法,也就說,在計算機中,1-1
其實是1+(-1)
。如果用原碼表示,計算結果是不對的。
符合直覺的方式表示負整數(高位變為1):
1 --> 0000 0001
-1 --> 1000 0001
-----------
-2 --> 1000 0010
1 - 1 = -2,結果不對。
使用補碼表示後:
1 --> 0000 0001
-1 --> 1111 1111
-----------
0 --> 0000 0000
1 - 1 = 0,結果正確。
整數的運算結果為什麼出現負數
理解二進位制加減法後,就可以理解正數的運算結果為什麼會出現負數:
byte a = 127;
byte b = 1;
byte c = (byte) (a + b);
// -128
system.out.println(c);
輸出為 -128,與我們預期的 128 不一致。
運算過程如下:
0111 1111
+0000 0001
-----------
1000 0000 (byte 在記憶體中只佔 8 位,首位位 1,會被認為是負數,所以結果是 -128)
由於 byte 在記憶體中佔 8 位,首位為 1,會被認為是負數,所以輸出的結果是 -128。
整數的二進位制表示,需要區分正整數和負整數。求負整數的二進位制表示時,需要將其對應正整數的二進位制進行補碼運算。
只有進行補碼運算,才能保證二進位制加減法正確。
理解二進位制加減法後,就可以理解為什麼整數的運算結果會出現負數,計算機會將首位為 1 的二進位制數當作負數,在我們存放資料的資料結構位數不足以容納我們資料時,就可能會出現預期結果和計算結果不一致的情況。
LintCode 二進位制表示
給定乙個數將其轉換為二進位制 均用字串表示 如果這個數的小數部分不能在 32 個字元之內來精確地表示,則返回 error 樣例 n 3.72 返回 error n 3.5 返回 11.1 題目很簡單,直接上 吧 public class binaryrepresention return res.r...
LintCode 二進位制表示
給定乙個數將其轉換為二進位制 均用字串表示 如果這個數的小數部分不能在 32 個字元之內來精確地表示,則返回 error 您在真實的面試中是否遇到過這個題?yes 樣例n 3.72 返回 error n 3.5 返回 11.1 好久沒做題 有點懵逼 根據資料試出來的 臥槽 public class ...
二進位制表示 LintCode
給定乙個數將其轉換為二進位制 均用字串表示 如果這個數的小數部分不能在 32 個字元之內來精確地表示,則返回 error 樣例 n 3.72 返回 error n 3.5 返回 11.1 ifndef c180 h define c180 h include include using namesp...