用二进制构造计算世界
目录
-
CPU
内存
CPU 和 内存使用IC电子元件作为基本单元,IC电子元件有不同种形状,但是其内部的组成单元称为一个个的引脚。有人说CPU 和 内存内部都是超大规模集成电路,其实IC 就是集成电路(Integrated Circuit)。 IC元件切面图
IC元件两侧排列的四方形块就是引脚,IC的所有引脚,只有两种电压:
0V
和5V
,IC的这种特性,也就决定了计算机的信息处理只能用 0 和 1 表示,也就是二进制来处理。一个引脚可以表示一个 0 或 1 ,所以二进制的表示方式就变成 0、1、10、11、100、101等,虽然二进制数并不是专门为 引脚 来设计的,但是和 IC引脚的特性非常吻合。计算机的最小集成单位为
位
,也就是比特(bit)
,二进制数的位数一般为 8位、16位、32位、64位,也就是 8 的倍数,为什么要跟 8 扯上关系呢? 因为在计算机中,把 8 位二进制数称为 一个字节, 一个字节有 8 位,也就是由 8个bit构成。为什么1个字节等于8位呢?因为 8 位能够涵盖所有的字符编码,这个记住就可以了。
字节是最基本的计量单位,位是最小单位。
用字节处理数据时,如果数字小于存储数据的字节数 ( = 二进制的位数),那么高位就用 0 填补,高位和数学的数字表示是一样的,左侧表示高位,右侧表示低位。比如 这个六位数用二进制数来表示就是
100111
,只有6位,高位需要用 0 填充,填充完后是00100111
,占一个字节,如果用 16 位表示 就是0000 0000 0010 0111
占用两个字节。我们一般口述的 32 位和 64位的计算机一般就指的是处理位数,32 位一次可以表示 4个字节,64位一次可以表示8个字节的二进制数。
我们一般在软件开发中用十进制数表示的逻辑运算等,也会被计算机转换为二进制数处理。对于二进制数,计算机不会区分他是 图片、音频文件还是数字,这些都是一些数据的结合体。
什么是二进制数
那么什么是二进制数呢?为了说明这个问题,我们先把
00100111
这个数转换为十进制数看一下,二进制数转换为十进制数,直接将各位置上的值 * 位权即可,那么我们将上面的数值进行转换 二进制转十进制表示图
也就是说,二进制数代表的
00100111
转换成十进制就是 39,这个 39 并不是 3 和 9 两个数字连着写,而是 3 * 10 + 9 * 1,这里面的10 , 1
就是位权,以此类推,上述例子中的位权从高位到低位依次就是7 6 5 4 3 2 1 0
。这个位权也叫做次幂,那么最高位就是2的7次幂,2的6次幂 等等。二进制数的运算每次都会以2为底,这个2 指得就是基数,那么十进制数的基数也就是 10 。在任何情况下位权的值都是 数的位数 - 1,那么第一位的位权就是 1 - 1 = 0, 第二位的位权就睡 2 - 1 = 1,以此类推。那么我们所说的二进制数其实就是 用0和1两个数字来表示的数,它的基数为2,它的数值就是每个数的位数 * 位权再求和得到的结果,我们一般来说数值指的就是十进制数,那么它的数值就是 3 * 10 + 9 * 1 = 39。
移位运算和乘除的关系
在了解过二进制之后,下面我们来看一下二进制的运算,和十进制数一样,加减乘除也适用于二进制数,只要注意逢 2 进位即可。二进制数的运算,也是计算机程序所特有的运算,因此了解二进制的运算是必须要掌握的。
首先我们来介绍
移位
运算,移位运算是指将二进制的数值的各个位置上的元素坐左移和右移操作,见下图 移位过程
上述例子中还是以 39 为例,我们先把十进制的39 转换为二进制的
0010 0111
,然后向左移位 <<
一个字节,也就变成了0100 1110
,那么再把此二进制数转换为十进制数就是上面的78, 十进制的78 竟然是 十进制39 的2倍关系。我们在让0010 0111
左移两位,也就是1001 1100
,得出来的值是 156,相当于扩大了四倍!因此你可以得出来此结论,左移相当于是数值扩大的操作,那么
右移 >>
呢?按理说右移应该是缩小 1/2,1/4 倍,但是39 缩小二倍和四倍不就变成小数了吗?这个怎么表示呢?请看下一节便于计算机处理的补数
刚才我们没有介绍右移的情况,是因为右移之后空出来的高位数值,有 0 和 1 两种形式。要想区分什么时候补0什么时候补1,首先就需要掌握二进制数表示
负数
的方法。二进制数中表示负数值时,一般会把最高位作为符号来使用,因此我们把这个最高位当作符号位。 符号位是 0 时表示
正数
,是 1 时表示负数
。那么 -1 用二进制数该如何表示呢?可能很多人会这么认为: 因为 1 的二进制数是0000 0001
,最高位是符号位,所以正确的表示 -1 应该是1000 0001
,但是这个答案真的对吗?计算机世界中是没有减法的,计算机在做减法的时候其实就是在做加法,也就是用加法来实现的减法运算。比如 100 - 50 ,其实计算机来看的时候应该是 100 + (-50),为此,在表示负数的时候就要用到