補碼:
-
假設當前時針指向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。
-
反碼跟原碼是正數時,一樣;負數時,反碼就是原碼符號位除外,其他位按位取反。
浙公網安備 33010602011771號