(二)数据是用二进制数表示的

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. 数据是用二进制数表示的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值