补码:
-
假设当前时针指向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。
-
反码跟原码是正数时,一样;负数时,反码就是原码符号位除外,其他位按位取反。