主页 > imtoken老版本 > 二进制、十进制、十六进制转换

二进制、十进制、十六进制转换

imtoken老版本 2023-11-24 05:07:44

考虑前后:

9a8d0b324ff4e91afcb50df95a45899a.png

例子:

接下来,我们将详细了解基数之间的转换,首先,我们将了解二进制、十进制、十六进制。

从我们熟悉的小数开始,即每10进1,即从0...9,9加1时进。同理:

二进制表示每2进1,即从0到1,1加1时进位。

十六进制表示每16个1,即从0...F(F为15),F加1时带入。

一:2 十六进制转十六进制:

二进制数从低位到高位组成一组4位,每一组可以直接用一个十六进制数表示,例如:

0011 0101 1011 1111
3      5    B    F

例子:

位置:1 1 1 1

不是十进制的货币

2∧3 *1 2∧2*1 2∧1* 1 2∧0*1

重量:8 4 2 1

这里很容易拼凑起来,只要1、2、4、8权重对应的位置都是1,我们加起来就可以了。

前四位(0011)后两位1:(1+2=3)

然后四位数字(0101)从右到左第一个,第三个是1:(1+4=5)

那么 (1011):(1+2+8=B)

最后(1111):(1+2+4+8=F)

只要记住 1、2、4、8 的顺序即可。

所以 0011010110111111B=35BFH

(注:十六进制数字后缀为H,十进制D,八进制O,二进制B,其中B和H结尾的强调十六进制)

不是十进制的货币

二:十六进制转二进制

将16进制的每一位数字表示为4位的二进制数(小于4位,用0补码),可以得到对应的二进制数,例如:

  A    1    9   C
1010 0001 1001 1100

同上(在1,2,4,8中),A=2+8,所以二进制数中从右到左第二位和第四位为1,即1010

9=1+8,所以二进制数中从右到左的第一位和第四位为1,即1001

三:二进制转十进制数

每个二进制数的总和乘以它对应的权重就是对应的二进制数十进制数:eg

1 0 。 1 0

2∧1 *1 2∧0 *0 。 2∧(-1)*1 2∧(-2)*0

2∧1 *1 + 2∧0 *0 。 2∧(-1)*1 + 2∧(-2)*0

不是十进制的货币

=2.5

1011100.10111B = 2^6+2^4+2^3+2^2+2^-1+2^-3+2^-4+2^-5 = 92.71875D

四:十进制转二进制

(注:十六进制以H为后缀,十进制D,八进制O,二进制B,其中强调末尾的B和H)

将要转换的十进制数的整数部分连续除以2,并计算余数,直到商为0,例如:

整数N=117D
117/2=58余1(a0=1)
58/2=29余0 (a1=0)
29/2=14余1(a2=1)
14/2=7 余0 (a3=0)
7/2=3余1 (a4=1)
3/2=1余1(a5=1)
1/2=0余1(a6=1) 用短除法更快一点
即N=117D=1110101B

转换后的十进制数的小数部分应乘以2并倒计时,直到结果的小数部分为直到0

例如小数 N=0.8125D
0.8125*2=1.625 (b1=1)
0.625*2=1.25 (b2=1)
0.25*2=0.5 (b3=0)
0.5*2=1.0 (b4=1)
所以N=0.8125D=0.1101B

五:将十六进制数转换为十进制数

每个十六进制数及其对应的权重乘积之和为对应的十进制数,例如:

不是十进制的货币

N=BF3CH
=11*16^3+15*16^2+3*16^1+12*16^0
=48956D

六:十进制转十六进制

1 : 可以先转换成二进制再转换成十六进制

2:除法:将要转换的十进制数的整数部分除以16,并记录余数直到商为0:例如:

N=48956D
48956/16 = 3059 余12(a0=12)
3059/16=191 余3 (a1=3)
191/16=11 余15 (a2=15)
11/16 = 0 余11 (a3=11)
所以:N=48956D = BF3CH

原码、补码、反码

原码:最高位表示符号(0表示正数,负数用1),其他位表示数字位,称为有符号数的原码表示。如图不是十进制的货币,两个原码的区别是最高位一个是0,一个是1,为什么要带符号呢?因为它既可以表示正数,也可以表示负数,你占位表示±后,就只能有7位代表数据大小,最大值为1111 111或2∧7-1。

N=45=00101101B 【N】原码=0 0101101B
M=-45 【M】原码=1 0101101B

补码:正数的反码与原码相同,符号位用0表示,数字位的值不变。负码的符号位用1表示,值位是按位取反形成的原始码值,即0变成1,1变成0,例如:

N=45=00101101B 【N】反码=0 0101101B
M=-45 【M】反码=1 1010010B

不是十进制的货币

补码:正数的补码与原码相同,即符号位用0表示,数字位的值不变。负数的补码是反码加1,例如:

N=45=00101101B 【N】补码=00101101B
M=-45 【M】补码=11010011B
例如:11000111=-57计算方式:
最高位为1,先加负号
接着取反码+1=00111001=57
即-57

1073a5c7fb67411f0a07ab54d42326ce.png

二进制加法

在这个例子当中
25 的原码:00011001 -25的补码为:11100111
32 的原码:00100000 -32的补码为:11100000
即-25等于25的反码+1
最终的结果为 11000111即-57,将其反码加1之后转化为十进制为57(验证了结果的正确性)
在这里11000111最前面应该还有个1,在这里系统将其抛弃了(但不是彻底抛弃,这里的进位被PSW寄存器里记录了,去掉他并不影响结果)

补表号范围

N位二进制数能够表示的 无符号整数范围:0 ~ 2^n - 1
如8位:0~255 (8个位都表示数值了,最大2^8-1)
N位二进制数能够表示的 有符号整数范围:-2^(n-1) ~ 2^(n-1) - 1
如8位:-128~127 (因为最高位0,1表示正负,其余7位才表示数值,最大2^7-1)

计算11111111转换成十进制数:

然后取反码:0000 0000

然后+1

0000 0001 = 1

如果为负不是十进制的货币,则最终结果为-1

无符号时为 255,有符号时为 -1