1. 用二进制数表示计算机信息的原因
IC的一个引脚,只能表示两个状态。这个特性,决定了计算机的信息数据只能用二进制数来处理。
计算机处理信息的最小单位一一位,就相当于二进制中的一位。位的英文bit是二进制数位(binary digit)的缩写。
二进制数的位数一般是8的倍数,这是因为计算机所处理的信息的基本单位是8位二进制数。
8位二进制数被称为一个字节,字节是最基本的信息计量单位。
位是最小单位,字节是基本单位。
内存和磁盘都使用字节单位来存储和读写数据,使用位单位则无法读写数据。
因此,字节是信息的基本单位。
用字节单位处理数据时,如果数字小于存储数据的字节数(=二进制数的位数),那么高位上就用0填补。
例如,100111这个6位二进制数,用8位(=1字节)表示时为00100111。
程序运行时计算机内部处理的也是用二进制数表示的信息。
2. 什么是二进制数
二进制数的值转换成十进制数的值,只需将二进制数的各数位的值和位权相乘,然后将相乘的结果相加即可。
例如,十进制数39的各个数位的数值,3表示的是3x10=30,9表示的是9x1=9。
这里和各个数位的数值相乘的10和1,就是位权。
数字的位数不同,位权也不同。第1位(最右边的一位)是10的0次幂(=1),第2位是10的1次幂(=10),依此类推。
位权的思考方式也同样适用于二进制数。
即第1位是2的0次幂(=1),第2位是2的1次幂(=2),依此类推。
“oo的xx次幂”表示位权,其中,十进制数的情况下oo部分为10,二进制数的情况下则为2。这个称为基数。
十进制数是以10为基数的计数方法,二进制数则是以2为基数的计数方法。
“oo的xx次幂”中的xx,在任何进制数中都是“数的位数-1”。即第1位是1-1=0次幂,第2位是2-1=1次幂。
3. 移位运算和乘除运算的关系
移位运算指的是将二进制数值的各数位进行左右移位(shift=移位)的运算。
移位有左移(向高位方向)和右移(向低位方向)两种。
在一次运算中,可以进行多个数位的移位操作。
代码清单2-1中列出的是把变量a中保存的十进制数值39左移两位后再将运算结果存储到变量b中的C语言程序。
<<这个运算符表示左移,右移时使用>>运算符。
<<运算符和>>运算符的左侧是被移位的值,右侧表示要移位的位数。
十进制数39用8位的二进制表示是00100111,左移两位后是10011100,再转换成十进制数就是156。
十进制数左移后会变成原来的10倍、100倍、1000…
同样,二进制数左移后就会变成原来的2倍、4倍、8倍…
反之,二进制数右移后则会变成原来的1/2、1/4、1/8…
4. 便于计算机处理的“补数”
二进制数中表示负数值时,一般会把最高位作为符号来使用,因此我们把这个最高位称为符号位。
符号位是0时表示正数,符号位是1时表示负数。
计算机在做减法运算时,实际上内部是在做加法运算。
在表示负数时就需要使用“二进制的补数”。补数就是用正数来表示负数。
为了获得补数,我们需要将二进制数的各数位的数值全部取反,然后再将结果加1。
例如,用8位二进制数表示-1时,只需求得1也就是00000001的补数即可。
具体来说,就是将各数位的0取反成1,1取反成0,然后再将取反的结果加1,最后就转化成了11111111。
补数求解的变换方法就是“取反+1”。
将二进制数的值取反后加1的结果,和原来的值相加,结果为0。
5. 逻辑右移和算术右移的区别
右移有移位后在最高位补0和补1两种情况。
当二进制数的值表示图形模式而非数值时,移位后需要在最高位补0。类似于霓虹灯往右滚动的效果。这就称为逻辑右移(图2-9)。
将二进制数作为带符号的数值进行运算时,移位后要在最高位填充移位前符号位的值(0或1)。这就称为算术右移。
如果数值是用补数表示的负数值,那么右移后在空出来的最高位补1,就可以正确地实现1/2、1/4、1/8等的数值运算。如果是正数,只需在最高位补0即可。
举一个右移的例子。将-4(=11111100)右移两位。
这时,逻辑右移的情况下结果就会变成00111111,也就是十进制数63。
而算术右移的情况下,结果就会变成1111111,用补数表示就是-1,即-4的1/4。
只有在右移时才必须区分逻辑位移和算术位移。
左移时,无论是图形模式(逻辑左移)还是相乘运算(算术左移),都只需在空出来的低位补0即可。
介绍一下符号扩充。以8位二进制数为例,符号扩充就是指在保持值不变的前提下将其转换成16位和32位的二进制数。
将01111111这个正的8位二进制数转换成16位二进制数时,很容易就能得出0000000001111111这个正确结果。
但是像11111111这样用补数来表示的数值,将其表示成1111111111111111就可以了。
也就是说,不管是正数还是用补数表示的负数,都只需用符号位的值(0或者1)填充高位即可。这就是符号扩充的方法。
6. 掌握逻辑运算的窍门
将二进制数表示的信息作为四则运算的数值来处理就是算术。
而像图形模式那样,将数值处理为单纯的0和1的罗列就是逻辑。
计算机能处理的运算,大体可分为算术运算和逻辑运算。
算术运算是指加减乘除四则运算。
逻辑运算是指对二进制数各数字位的0和1分别进行处理的运算,包括逻辑非(NOT运算),逻辑与(AND运算),逻辑或(OR运算)和逻辑异或(XOR运算)四种。
逻辑非指的是0变成1、1变成0的取反操作。
逻辑与指的是“两个都是1"时,运算结果为1,其他情况下运算结果都为0的运算。
辑或指的是“至少有一方是1"时,运算结果为1,其他情况下运算结果都是0的运算。
逻辑异或指的是排斥相同数同数值的运算。“两个数值不同",也就是说,当“其中一方是1,另一方是0”时运算结果是1,其他情况下结果都是0。
不管是几位的二进制数,在进行逻辑运算时,都是对相对应的各数位分别进行运算。
参考
《程序是怎样跑起来的》 —— 2. 数据是用二进制数表示的