十进制转二进制
1、除2取余, 余数倒序; 得到的序列就是二进制表示形式
2、例如: 将十进制(100) 转换为二进制数
十进制 --> 二进制 100 --> 1100100
100 / 2 = 50 0
50 / 2 = 25 0
25 / 2 = 12 1
12 / 2 = 6 0
6 / 2 = 3 0
3 / 2 = 1 1
1 / 2 = 0 1
二进制转十进制
每一位二进制进制位的值 * 2的当前索引次幂; 再将所有位求出的值相加
例如: 将二进制01100100转换为十进制
01100100
索引从右至左, 从零开始
第0位: 0 * 2^0 = 0;
第1位: 0 * 2^1 = 0;
第2位: 1 * 2^2 = 4;
第3位: 0 * 2^3 = 0;
第4位: 0 * 2^4 = 0;
第5位: 1 * 2^5 = 32;
第6位: 1 * 2^6 = 64;
第7位: 0 * 2^7 = 0;
最终结果为: 0 + 0 + 4 + 0 + 0 + 32 + 64 + 0 = 100
二进制转八进制
三个二进制位代表一个八进制位, 因为3个二进制位的最大值是7,而八进制是逢8进1
例如: 将二进制01100100转换为八进制数
从右至左每3位划分为8进制的1位, 不够前面补0
-->001 100 100
第0位: 100 等于十进制 4
第1位: 100 等于十进制 4
第2位: 001 等于十进制 1
最终结果:144就是转换为8进制的值
二进制转十六进制
四个二进制位代表一个十六进制位,因为4个二进制位的最大值是15,而十六进制是逢16进1
例如: 将二进制01100100转换为十六进制数
从右至左每4位划分为16进制的1位, 不够前面补0
-->0110 0100
第0位: 0100 等于十进制 4
第1位: 0110 等于十进制 6
最终结果:64就是转换为16进制的值
其它进制转换为十进制
系数 * 基数 ^ 索引 之和
例如:
十进制-->十进制 12345 = 10000 + 2000 + 300 + 40 + 5 = (1 * 10 ^ 4)
+ (2 * 10 ^ 3)
+ (3 * 10 ^ 2)
+ (4 * 10 ^ 1)
+ (5 * 10 ^ 0)
= (1 * 10000)
+ (2 + 1000)
+ (3 * 100)
+ (4 * 10)
+ (5 * 1)
+ = 10000 + 2000 + 300 + 40 + 5 = 12345
规律: 其它进制转换为十进制的结果 = 系数 * 基数 ^ 索引 之和
系数: 每一位的值就是一个系数
基数: 从x进制转换到十进制, 那么x就是基数
索引: 从最低位以0开始, 递增的数
十进制快速转换为其它进制
十进制除以 基数 取余, 倒叙读取
十进制 --> 二进制 100 --> 1100100
100 / 2 = 50 0
50 / 2 = 25 0
25 / 2 = 12 1
12 / 2 = 6 0
6 / 2 = 3 0
3 / 2 = 1 1
1 / 2 = 0 1
十进制 --> 八进制 100 --> 144
100 / 8 = 12 4
12 / 8 = 1 4
1 / 8 = 0 1
十进制 --> 十六进制 100 --> 64
100 / 16 = 6 4
6 / 16 = 0 6
十进制小数转换为二进制小数
1、整数部分,直接转换为二进制即可
2、小数部分,使用"乘2取整,顺序排列"
3、用2乘十进制小数,可以得到积,将积的整数部分取出,再用2乘余下的小数部分,直到积中的小数部分为零,或者达到所要求的精度为止
4、然后把取出的整数部分按顺序排列起来, 即是小数部分二进制
5、最后将整数部分的二进制和小数部分的二进制合并起来, 即是一个二进制小数
例如: 将12.125转换为二进制
// 整数部分(除2取余)
12/ 2------ 6 // 余0
6/ 2------ 3 // 余0
3/ 2------ 1 // 余1
1/ 2------ 0 // 余1
12 --> 1100
// 小数部分(乘2取整数积)
0.125* 2 ------ 0.25 //0
0.25* 2 ------ 0.5 //0
0.5* 2 ------ 1.0 //1
0.0--> 0.125 --> 0.001
12.8125 --> 1100.001
二进制小数转换为十进制小数
1、整数部分按照二进制转十进制即可
2、小数部分从最高位开始乘以2的负n次方, n从1开始
例如: 将 1100.001转换为十进制
// 整数部分(乘以2的n次方, n从0开始)
0 * 2^0 = 0
0 * 2^1 = 0
1 * 2^2 = 4
1 * 2^3 = 8
1100 == 8 + 4 + 0 + 0 == 12
// 小数部分(乘以2的负n次方, n从0开始)
0 * (1/2) = 0
0 * (1/4) = 0
1 * (1/8) = 0.125
.001 == 0 + 0 + 0.125 == 0.125
1100.001 --> 12.125
原码反码补码
计算机只能识别0和1, 所以计算机中存储的数据都是以0和1的形式存储的
数据在计算机内部是以补码的形式储存的, 所有数据的运算都是以补码进行的
正数的原码、反码和补码
正数的原码、反码和补码都是它的二进制
例如: 12的原码、反码和补码分别为
原码:0000 0000 0000 0000 0000 0000 0000 1100
反码:0000 0000 0000 0000 0000 0000 0000 1100
补码:0000 0000 0000 0000 0000 0000 0000 1100
负数的原码、反码和补码
1、二进制的最高位我们称之为符号位, 最高位是0代表是一个正数, 最高位是1代表是一个负数
2、一个负数的原码, 是将该负数的二进制最高位变为1
3、一个负数的反码, 是将该数的原码 除了符号位 以外的其它位取反
4、一个负数的补码, 就是它的反码 + 1
例如: -12的原码、反码和补码分别为
0000 0000 0000 0000 0000 0000 0000 1100 // 12二进制
1000 0000 0000 0000 0000 0000 0000 1100 // -12原码
1111 1111 1111 1111 1111 1111 1111 0011 // -12反码
1111 1111 1111 1111 1111 1111 1111 0100 // -12补码
负数的原码、反码和补码逆向转换
1、反码 = 补码-1
2、原码= 反码最高位不变, 其它位取反
1111 1111 1111 1111 1111 1111 1111 0100 // -12补码
1111 1111 1111 1111 1111 1111 1111 0011 // -12反码
1000 0000 0000 0000 0000 0000 0000 1100 // -12原码
为什么要引入反码和补码
计算机只能做加法运算, 不能做减法和乘除法, 所
以的减法和乘除法内部都是用加法来实现的
例如: 1 - 1, 内部其实就是 1 + (-1);
例如: 3 * 3, 内部其实就是 3 + 3 + 3;
例如: 9 / 3, 内部其实就是 9 + (-3) + (-3) + (-3);
首先我们先来观察一下,如果只有原码会存储什么问题
很明显, 通过我们的观察, 如果只有原码, 1-1的结果不对
// 1 + 1
0000 0000 0000 0000 0000 0000 0000 0001 //1原码
+0000 0000 0000 0000 0000 0000 0000 0001 // 1原码
--------------------------------
0000 0000 0000 0000 0000 0000 0000 0010 == 2
// 1 - 1;
//1 + (-1);
0000 0000 0000 0000 0000 0000 0000 0001 // 1原码
+1000 0000 0000 0000 0000 0000 0000 0001 // -1原码
------------------------------------
1000 0000 0000 0000 0000 0000 0000 0010 == -2
正是因为对于减法来说,如果使用原码结果是不正确的, 所以才引入了反码
1、通过反码计算减法的结果, 得到的也是一个反码;
2、将计算的结果符号位不变其余位取反,就得到了计算结果的原码
3、通过对原码的转换, 很明显我们计算的结果是-0, 符合我们的预期
// 1 - 1; 1 + (-1);
0000 0000 0000 0000 0000 0000 0000 0001 // 1反码
1111 1111 1111 1111 1111 1111 1111 1110 // -1反码
---------------------------------------
1111 1111 1111 1111 1111 1111 1111 1111 // 计算结果反码
1000 0000 0000 0000 0000 0000 0000 0000 // 计算结果原码 == -0
虽然反码能够满足我们的需求, 但是对于0来说, 前面的负号没有任何意义, 所以才引入了补码
由于int只能存储4个字节, 也就是32位数据, 而计算的结果又33位, 所以最高位溢出了,符号位
变成了0, 所以最终得到的结果是0
// 1 - 1; 1 + (-1);
0000 0000 0000 0000 0000 0000 0000 0001 // 1补码
1111 1111 1111 1111 1111 1111 1111 1111 // -1补码
---------------------------------------
10000 0000 0000 0000 0000 0000 0000 0000 // 计算结果补码
0000 0000 0000 0000 0000 0000 0000 0000 // == 0