1.1 二进制,十进制,十六进制转换

霄
2023-08-17 / 0 评论 / 32 阅读 / 正在检测是否收录...

原文 https://zhuanlan.zhihu.com/p/481513009

思前想后:

接下来我们细致理解进制之间的转换

一:2进制转换为16进制:

把二进制数从低位到高位每4位组成一组,直接用16进制数来表示即可,例如:

0011 0101 1011 1111

3 5 B F

这里很好拼凑,1,2,4,8权相对应的位置只要是1,咱们加起来就可以了

第一个末尾俩1(1+2=3),接着(1+4=5),接着(1+2+8=B)最后(1+2+4+8=F),记住

1,2,4,8的顺序就好了

所以 0011010110111111B=35BFH

注意:十六进制数以H为后缀,十进制D,八进制O,二进制B,这里的末尾B和H是强调是什么进制的)

二:16进制转为2进制

把16进制数中每一位用4为二进制数来表示(不足四位用0补充),即可得到相对应的二进制数,例如:

A 1 9 C

1010 0001 1001 1100

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

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

三:2进制转换为10进制数

各位二进制数码乘以与其对应的权之和即为与该二进制数对应的十进制数:例如

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

四:10进制转换为2进制

把要转换的十进制数的整数部分不断除以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

五:16进制数转换为10进制数

各位十六进制数与其对应权值的乘积之和即为相应的十进制数,例如:

N=BF3CH

=1116^3+1516^2+316^1+1216^0

=48956D

六:10进制转换为16进制

1:可以先转换为2进制再转换为16进制

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),其它位表示数值位,称为有符号数的原码表示法,例如:

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

二进制加法

在这个例子当中

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转换为十进制数:

  • 无符号:2^8-1=255

  • 有符号:最高位是1,先确定是负数

接着取反码:0000 0000

接着+1

0000 0001 = 1

加上确定是负数,最终结果为-1

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

扫描二维码,在手机上阅读!
95

评论

博主关闭了当前页面的评论