補碼:

  • 假設當前時針指向8點,而準確時間是6點,調整時間可有以下兩種撥法:一種是倒撥2小時,
    即8-2=6;另一種是順撥10小時,8+10=12+6=6,即8-2=8+10=8+12-2(mod 12).在12為模的系統里,
    加10和減2效果是一樣的,因此凡是減2運算,都可以用加10來代替。

  • 計算機系統中減法問題也可以化成加法問題,
    只需把減數用相應的補數表示就可以了。把補數用到計算機對數的處理上,就是補碼

  • 例:求-5的補碼。
    -5對應負數5(00000101)→所有位取反(11111010)→加00000001(11111011)
    所以-5的補碼是11111011。

  • 0的補碼
    數0的補碼表示是唯一的
    [+0]補=[+0]反=[+0]原=00000000
    [-0]補=11111111+1=00000000

進制轉換問題


//1、把?個?進制數轉為八進制
//思路:用do{}while();循環,保證str里有數字
//每次循環num先取余8拼到str里,之后num整除8賦值給自己,直到num到0為?。
public static String decToOct(int num) {
    if (num < 0) {
        //          -10的二進制是:   ?1_777_777_777_777_777_777_766?
        //            10的八進制是   0_000_000_000_000_000_000_012
        //            所以,八進制正數是最高位是0
        //            八進制負數是最高位是1
        return"num<0";
    }
    String str = "";
    do {
        int mod = num % 8;
        str = mod + str;
        num /= 8;
    } while (num != 0);
    return str;
}

//2、把?個?進制數轉為二進制
//思路:同理
public static String decToBin(int num) {
    if (num < 0) {
        //          -10的二進制是:   ?(57個1)_1111_0110?
        //            10的二進制是   ?(57個1)_0000_1010
        //            所以,二進制正數是最高位是0
        //            二進制負數是最高位是1
        return"num<0";
    }
    String str = "";
    do {
        int mod = num % 2;
        str = mod + str;
        num /= 2;
    } while (num != 0);
    return str;
}

//3、把?個?進制數轉為?六進制
//思路:多了ABCDEF分別對應10進制的10,11,12,13,14,15
//創建一個數組,進行數組下標對應,不用if判斷了
public static String decToHex(int num) {
    if (num < 0) {
        //          -10的?六進制是:   ?FFFF_FFFF_FFFF_FFF6?
        //            10的?六進制是   0000_0000_0000_000A
        //            所以,?六進制正數是最高位是0
        //            ?六進制負數是最高位是F
        return"num<0";
    }
    char[] chars = "0123456789ABCDEFG".toCharArray();
    String str = "";
    do {
        int mod = num % 16;
        str = chars[mod] + str; //取出余數,拼接
        num /= 16;
    } while (num != 0);
    return "ox"+str;
}




原碼

原碼是計算機機器數中最簡單的一種形式,數值位就是真值的絕對值,

  • 符號位位“0”時表示正數,

  • 符號位為“1”時表示負數,

  • 原碼又稱帶符號的絕對值。

  • 為了方便整數和小數區別,整數的符號位與數值位之間用“,”隔開,小數的符號位與數值位之間用“.”隔開。

反碼

反碼通常是用來由原碼求補碼或者由補碼求原碼的過渡碼。

  • “+0”和“-0”不一樣,以8位機器數為例,整數的“+0”原碼為0,0000000

  • 反碼為0,0000000;整數的“-0”原碼為1,0000000,反碼為1,1111111;小數的“+0”原碼為0.0000000,反碼為0.0000000;小數的“-0”原碼為1.0000000

  • 小數的“-0”反碼為1.1111111。

  • 反碼跟原碼是正數時,一樣;負數時,反碼就是原碼符號位除外,其他位按位取反。