二进制
前言
世界上分两种人,第1
种是知道二进制的,第10
种是不知道二进制的。
进制
所谓进制,就是进位制度。
0 1 2 3 4 5 6 7 8 9,十个基本元素就是十进制
基本元素 | 数量 | 名称 | 进位后 |
---|---|---|---|
0 1 2 3 4 5 6 7 8 9 | 10 | 十进制 | 11 12 13 14 15 16 17 18 19 |
0 1 2 3 4 5 6 7 | 8 | 八进制 | 10 11 12 13 14 15 16 17 |
0 1 2 3 | 4 | 四进制 | 10 11 12 13 |
0 1 | 2 | 二进制 | 10 11 |
思考1: 所谓进制,不过如此,那么你知道十六进制的
基本元素
和第一次进位后
的结果是怎样的嘛?
二进制
我们的学习重点也就是二进制——机器语言的本质。
首先介绍一个小技巧,为了用二进制表示十进制的数字,需要四个二进制位来才可以完全表示,这样的一种方式形成了不同的编码(雷格码、2421
码、8421
码,等等),其中有必要介绍一下8421
码,又称作BCD
码,介绍这个只是为了帮助大家更快的在大脑中转换数据!
二进制转换成十进制的方法很直白:
$$
11010 = 110^4+110^3+010^2+110^1+0*10^0
$$
$$
(11010)_2 =12^4+12^3+02^2+12^1+0*2^0
$$
如果脑子里也这样计算的话,啊这……但是如果按照8421
码的位次来记住1111
是8+4+2+1=15
的话,记住1011
是8+0+2+1=11
的话,这样貌似可以少思考一些,从而降低因进制转换的脱发风险~(其实就是把每位二进制所对应的十进制数记住而已emmm……)
思考2:这是二进制到十进制的转换,那么十进制到二进制、十进制到十六进制、十进制与八进制、八进制与二进制、八进制与十六进制、二进制与十六进制的转换,大家自己去学习一下吧~
补码与反码
先说转换,1
取反是0
,0
取反是1
方法 | 举例 | |
---|---|---|
反码 | 正数:不变,负数:首位不变,其他按位取反 | 0010 -> 0010 1010 -> 1101 |
补码 | 正数:不变,负数:反码加一 | 0010 -> 0010 1010 -> 1110 |
PS:首位是
1
代表负数,首位是0
表示正数,这种表示方式称为原码
介绍补码与反码,对日后处理指令运算有重要作用。
现在以钟表举例,下表是个坏表,现在要把表从10
点调整到2
点,有两种途径,一个是逆时针转动10 - 2 = 8
格,二是顺时针波动时针转动12 - 10 + 2 = 4
格,同样的结果,如果换一种表达,即:
$$
10点 - 8格 = 2点
$$
$$
10点+4格-12点=2点
$$
道理很简单,钟表可以看成十二进制,令A = 11
,B = 12
,钟表的进制元素就是0 1 2 3 4 5 6 7 8 9 A B
那么2
点就有两个意思,真正的2
点,和真正的14
点,14
点用是二进制表示就是**12
点(细品)**,表中只有12
个刻度,没办法表示14
点,这样就减去进位12(首位的1)
,这样就是最后的2
点。
所以这里的4
就是-8
的补码(十二进制),因为一个数减8
和加4
的效果一样,这就是补码的意义。
这样说显得有些啰嗦,区区一个二进制本不该如此冗余,但也不知道怎么说,那就这样吧~
应用
在二进制的世界中,一般数字的位数是固定的,就像人的手指数量固定一样。
假设1:二进制只有5
位,首位要表示符号。
假设2:二进制的世界中只有加法,以及反码的运算,没有其他的运算方式,那么如何实现减法呢?
以7+5
、7-5
、-7+5
、-7-5
这四个计算为例:
$$
7+5=00111+00101=01100
$$
$$
-5的反码=11010,-5的补码=11010+1=11011
$$
$$
7-5=00111+11011(-5的补码)=00010(本该是100010,但是只有5位,所以舍弃第一位)
$$
练习1:剩下的两个运算交给大家啦~