前言

世界上分两种人,第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码的位次来记住11118+4+2+1=15的话,记住10118+0+2+1=11的话,这样貌似可以少思考一些,从而降低因进制转换的脱发风险~(其实就是把每位二进制所对应的十进制数记住而已emmm……)

思考2:这是二进制到十进制的转换,那么十进制到二进制十进制到十六进制十进制与八进制八进制与二进制八进制与十六进制二进制与十六进制的转换,大家自己去学习一下吧~

补码与反码

先说转换,1取反是00取反是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点
$$

img

道理很简单,钟表可以看成十二进制,令A = 11B = 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+57-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:剩下的两个运算交给大家啦~