1. 二进制简介
二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”。当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的。计算机中的二进制则是一个非常微小的开关,用“开”来表示1,“关”来表示0。
2. 二进制表示
对于有n位整数,m位小数的二进制数据用加权系数展开式表示,可写为:
$a{n-1} \times 2^{n-1} + a{n-2} \times 2^{n-2} + \dots + a1 \times 2^1 + a_0 \times 2^0 + a{-1} \times 2^{-1} + a{-2} \times 2^{-2} + \dots + a{-m} \times 2^{-m}$
一般可简化为:$(a{n-1}a{n-2} \dots a1a_0 . a{-1}a{-2} \dots a{-m})_2$
表达式中形如$a_p$的写法表示为第$p$位的系数,它为0和1中的某一个数。
例如将二进制数据101.01写成加权系数的形式:
解:$(101.01)_2 = (1 \times 2^2) + (0 \times 2^1) + (1 \times 2^0) + (0 \times 2^{-1}) + (1 \times 2^{-2})$
可以这样来记,比如101.01整数部分有三位,从右往左从0开始数其指数系数依次就是0,1,2
小数部分有两位,从左往右从-1开始数其指数系数依次是-1,-2,然后用对应的位权系数乘以2的n次幂相加即可
也可以按照公式中读位的方式来记。
补充个小知识,一个数的负次方即为这个数正倒数的正次方。如 $2^{-5} = {\frac{1}{2}}^{5}$
3. 二进制运算
加运算:0+0=0,0+1=1,1+0=1,1+1=10 (逢2进1)
减运算:1-1=0,1-0=1,0-0=0,0-1=1,(向高位借1当2)
乘运算:0×0=0,0×1=0,1×0=0,1×1=1,(只有同时为“1”时结果才为“1”)
除运算:0÷1=0,1÷1=1,0÷0 = 0,1÷0 = 0 (无意义)
逻辑运算:
- 或运算:遇1得1
- 与运算:遇0得0
- 非运算:各位取反
4. 二进制转换
首先了解一个概念,什么是“权”。“权”就是进制的基底的n次幂。如二进制的权就是$2^n$了,十进制的权就是$10^n$。
接下来转换为其他进制:
(a.)二进制转十进制:
按权展开求和既可,简化运算时可以把数位数为0的项不写出来,(因为0乘以其他不为0的数都是0)。小数部分也一样,但精确度较少。
例1:$(1011)2 = (1 \times 2^3) + (0 \times 2^2) + (1 \times 2^1) + (1 \times 2^0) = (11){10}$
例2:$(11.01)_2 = (1 \times 2^1) + (1 \times 2^0) + (0 \times 2^{-1}) + (1 \times 2^{-2}) $
$= (2 + 1 + 0 + 0.25)_{10}$
$= (3.25)_{10}$
(b.)二进制转十六进制:
二进制数转换成十六进制数时,只要从小数点位置开始,向左或向右每四位二进制划分一组(不足四位数可补0),然后写出每一组二进制数所对应的十六进制数码即可,采用的是“四位一并法”。
例题:将二进制数10110.0011转成对应的十六进制数
首先将二进制数10110.0011写出对应的十六进制数码为0001 0110 . 0011
接下来再看十六进制表示和与二进制数之间的对应关系表:
十进制数表示与十六进制数表示对照表:
|
十六进制数与二进制数对应关系表:
|
对应关系表可以采用8421法来对应转换,可以参考8421码,牢记对应关系,在转换的过程中就会事半功倍。
然后将十六进制数码按取四合一法,即每四位取成一位,就是对应的十六进制数:
|
所以例题中的二进制数10110.0011转成十六进制数为0x16.3
注:十六进制的表示法,用字母H后缀表示,也可以用0x前缀表示,比如BH表示16进制11,比如0x23就是16进制的23
关于十六进制的转换,更加直观的理解可以参考这里。
(c.)二进制转八进制:
二进制转换为八进制,采用“三位一并法”,就是以小数点为中心向左或向右以每三位划分一组,(不足三位的补0),这样就可以轻松的进行转换。
例题:将二进制数10110.0011转成对应的八进制数
首先将二进制数10110.0011写出对应的八进制数码为010 110 . 001 100
接下来再看八进制表示和与二进制数之间的对应关系表:
|
对应关系表可以采用421法来对应转换,然后将八进制数码按取三合一法,即每三位取成一位,就是对应的八进制数:
|
所以例题中的二进制数10110.0011转成八进制数为26.14
5. 其他进制转换为二进制
(a.)十进制转二进制:
整数转换:采用连续除基取余(短除法),逆序排列法,直至商为0。
小数转换:采用连续乘基(即2)取整,顺序排列法,直至乘积没有小数,一般是乘不尽的,保留相应位数即可。
例题:将十进制数125.11转为二进制数(保留6位小数)
先算整数部分:(除2取余法)
|
再来算小数部分:(乘2取整法)
|
所以例题中最后结果为1111101.000111
(b.)十六进制转二进制:
把每一位十六进制数对应转换为一个四位二进制数即可。
例题:将十六进制数5FD6.7转为二进制数
由上面的对应关系表可以得出:
|
高位的0可以省去,所以最后结果为101111111010110.0111
(c.)八进制转二进制:
同理,把每一位八进制数对应转换为一个三位二进制数即可。
例题:将八进制数25.5转为二进制数
由上面的对应关系表可以得出:
|
高位的0可以省去,所以最后结果为10101.111
6. 其他进制的相互转换
其他进制转换都可以借助转为二进制再间接转换,但也有一些便捷的算法
(a.)十进制转十六进制:
整数转换:采用连续除16取余法,逆序排列法,直至商为0。
小数转换:采用连续乘基(即16)取整,顺序排列法,直至乘积没有小数,一般乘不尽,保留相应位数即可。
例题:将十进制数186.11转为十六进制数(保留6位小数)
先算整数部分:
|
再算小数部分:
|
所以例题中最后结果为BA.1C28F5
(b.)十进制转八进制:
同上面转换原理相同,整数部分使用除8取余法,小数部分使用乘8取整法
例题:将十进制数186.11转为八进制数(保留6位小数)
先算整数部分:
|
再算小数部分:
|
所以例题中最后结果为272.070243
(c.)十六进制转十进制:
十进制的权就是$10^n$,十六进制的权就是$16^n$,同理按权展开求和即可。
例如将十六进制BBA5 .2转为十进制数:
0xBBA5 .2F $ = 11 \times 16^3 + 11 \times 16^2 + 10 \times 16^1 + 5 \times 16^0 + 2 \times16^{-1}$
$=(45056 + 2816 + 160 + 5 + 0.125)_{10}$
$= (48037.125)_{10}$
(d.)八进制转十进制:
八进制的权就是$8^n$
例如将八进制75 .2转为十进制数,同理按权展开求和为:
$(75.2)_8 = (7 \times 8^1) + (5 \times 8^0) + (2 \times 8^{-1})$
$=(56+5+0.25)_{10}$
$=(61.25)_{10} $
7. 相关概念
(a.)机器数
一个数在计算机中的二进制表现形式,叫做这个数的机器数,机器数是带符号的,在计算机用一个数的最高位存放符号,正数位为0,负数为1。
例:+3(10进制) ——— 0000 0011(2进制) 计算机字节长8位
(b.)真值
将带符号的机器数对应的真正数值称为机器数的真值.
例:1000 0011(2) ——— 该数据代表的真值为-3(10)
(c.)原码、反码、补码
原码:一个整数按照绝对值大小转换成的二进制数称为原码
反码:将二进制数按位取反,取得的新二进制数称为原二进制数的反码。
补码:反码加1称为补码