|
|
本帖最后由 2421746310 于 2023-1-8 17:11 编辑
此内容是我在《韩顺平循序渐进学Java》中做的有关于进制转换与计算机计算原理的笔记
如有错误请指出
本贴只讲原理,若需要进制转换还是用工具比较方便
0b或0B表示二进制
0表示八进制
0x或0X表示十六进制
十六进制中
A表示10
B表示11
C表示12
D表示13
E表示14
F表示15
二进制转换为十进制实例:
规则:从最低位(右边)开始,将每个位上的数提取出来,乘以2的(位数-1)次方,然后求和
案例:将 0b1011 转成十进制的数
0b1011 = 1 * 2的(1-1)次方 + 1 * 2的(2-1)次方 + 0 * 2的(3-1)+ 1 * 2的(4-1)次方 = 1 + 2 + 0 + 8 = 11
八进制转换为十进制实例
规则:从最低位(右边)开始,将每个位上的数提取出来,乘以8的(位数-1)次方,然后求和
案例:将 0234 转成十进制数
0234 = 4 * 8^0 + 3 * 8^1 + 2 * 8^2 = 4 + 24 + 128 = 156
十六进制转换为十进制实例
规则:从最低位(右边)开始,将每个位上的数提取出来,乘以16的(位数-1)次方,然后求和
案例:请将0x23A转成十进制的数
0x23A = 10 * 16^0 + 3 * 16^1 + 2 * 16^2 = 10 + 48 + 512 = 570
十进制转换成二进制
规则:将该数不断除以2,直到商为0为止,然后将每步得到的余数倒过来,就是对应的二进制
案例 : 请将34转换为二进制
34 / 2 = 17 余 0
17 / 2 = 8 余 1
8 / 2 = 4 余 0
4 / 2 = 2 余 0
2 / 2 = 1 余 0
1
所以结果为0b100010,因为一个字节有八位,而这个数只有六位,所以实际结果为0b00100010
十进制转换成八进制
规则:将该数不断除以8,直到商为0为止,然后将每步得到的余数倒过来,就是对应的八进制
案例 : 请将131转换为八进制
131 / 8 = 16 余 3
16 /8 = 2 余 0
2
所以结果为0203
十进制转换成十六进制
规则:将该数不断除以16,直到商为0为止,然后将每步得到的余数倒过来,就是对应的十六进制
案例 : 请将237转换为十六进制
237 / 16 = 14 余 13 --> D
14 --> E
所以结果为0xED
二进制转换成八进制
规则:从低位开始,将二进制数每三位一组,转成对应的八进制数即可
案例:请将0b11010101转换为八进制
0b11010101 => 0325
101 => 5
010 => 2
11 => 3
二进制转换成十六进制
规则:从低位开始,将二进制数每四位一组,转成对应的十六进制数即可
案例:请将0b11010101转换为十六进制
0101 => 5
1101 => 13 --> D
结果为0xD5
八进制转换成二进制
规则:将八进制数每一位,转换成对应的一个三位的二进制数即可
案例:0237转换成二进制
0237
7 --> 111
3 --> 011
2 --> 010
最后结果为0b010011111
十六进制转换成二进制
规则:将十六进制数每一位,转换成对应的一个四位位的二进制数即可
案例:0x23B转换成二进制
0x23B
B = 11 => 1011
3 => 0011
2 => 0010
结果为001000111011
计算机计算原理
我们都知道计算机是通过二进制来计算的
一个字节有八个bit
比如将2转换为二进制为0000 0010
而负二则是1000 0010
二进制位的最大单位(就是从左向右数第一个)是用来表示正与负的
0表示正 1表示负
然后需要明白三个名词
原码 反码 补码
原码指的是讲一个十进制数转换为二进制
例如3转换为二进制就是0000 0011
这个就是原码
反码就是负数除了符号位(即指的从左向右数第一位)
1转成0 而0转成1
例如1000 0011的反码就是1111 1100
而正数的反码为它们本身
接下来就是补码
补码就是反码+1
例如1000 0011的反码是1111 1100
则它的补码就是 1111 1101
而正数的补码也为它本身
总结:
正数:原码=反码=补码
负数:反码=原码出符号位外
1转成0 0转成1
补码=反码+1
在计算机运算中都是用的补码接下来讲原因
加入让计算机运行1 - 1=
它是这样运算的
1 - 1 = 1 + (-1)
1转换成二进制为0000 0001
-1转换成二进制为1000 0001
0000 0001
+
1000 0001
–––––––––––––––––––––
1000 0010
最后结果为1000 0010这是源码计算的结果
转换为十进制是-2
但是我们都知道1-1=0
这种结果是错误的
接下来看反码
1 - 1=1 + (-1)
1转换成二进制为0000 0001
1的反码为0000 0001
因为正数的反码为它们本身
-1转换成二进制为1000 0001
反码为1111 1110
0000 0001
+
1111 1110
––––––––––––––
1111 1111
因为我们是用的反码运算所以最后结果也得用反码反转过来
1111 1111的反码为1000 0000
转换成十进制也就是-0
冷知识:因为1000 0000转成十进制不为-0
-0是不需要存在的,所以为了节省
1000 0000转成十进制为-128
所以也不正确
接下来看补码
1转换成二进制为0000 0001
补码为0000 0001
-1转换成二进制为1000 0001
补码为1111 1111
0000 0001
+
1111 1111
––––––––––––––
1 0000 0000
因为一个字节只有8个二进制位
所以最前面那个1不会被保存
只会留下8个0
这样就正好是0
这就是为什么要用补码的原因
字我都是一个一个打的,希望能点个赞 |
|