第二章——数据是用二进制数表示的

原创
2020/10/11 09:06
阅读数 28
  • 32位是几字节
    32 / 8 = 4字节。解析:1字节等于8位。
  • 二进制01011100转换成十进制数是多少
    92。解析:0 * pow(2,7) + 1* pow(2,6) +0 * pow(2,5) + 1 * pow(2,4) + 1 * pow(2,3) + 1 * pow(2,2) + 0 * pow(2,1) + 0 * pow(2,0) =64 + 16 + 8 + 4 =92
  • 二进制数00001111左移两位后,会变成原数的几倍?
    4倍。解析:二进制左移1位后会变成原来的两倍,左移两位后,会变成原来的2倍的2倍,即4倍
  • 补码形式表示的8位二进制数11111111,用十进制数表示的话是多少?
    -1
  • 补码形式表示的8位二进制数10101010,用16位的二进制数表示的话是多少?
    1111111110101010。解析:用原数的最高位1来填充高位
  • 反转部分图形模式时,使用的是什么逻辑运算? XOR运算只反转与1相对应的位。NOT运算时反转所有的位。

章节重点

  • 数据在计算机内部是以怎样的形式来表现的
  • 数据在计算机内部是以怎样的方法来运算的
  • 掌握使用二进制数来表示信息方法及其运算机制,自然就了解程序的运行机制了

章节结构

  • 二进制数的机制(概念)
  • 移位运算和乘除运算的关系
  • 补数
  • 逻辑右移和算术右移的区别
  • 逻辑运算的相关规则

1.用二进制数表示计算机信息的原因

  • 计算机处理信息的最小单位位(bit),就相当于二进制中的一位。
    bit是binary digit(二进制数位)的缩写。
    二进制数的位数一般是8位,16位,32位... 也就是8的倍数。
  • 计算机处理信息的基本单位是8位二进制数(又叫字节),8位二进制数即为一个字节。
    内存和磁盘都是用字节单位来存储和读写数据,使用位单位则无法读写数据。因此,字节是信息的基本单位
  • 对于用二进制表示的信息,计算机根据指令来进行信息的处理(运算)。

2.二进制数的机制

搞清楚所谓的进制数的四个核心关键词:数值位权基数位数

以十进制39为例

  • 3表示的是3* 10 = 30,9表示的是 9 * 1 =9。3和9就是数值
  • 这里和各个数位的数值相乘的10和1,就是位权
  • 第一位(最右边的一位)是10的0次幂(=1),第2位是10的1次幂(=10),○○的××次幂”中的○○是基数,xx是位权。第几位则表示的是位数
  • 位权与基数、位数的关系,“○○的××次幂”中的xx,在任何进制数中都是“数的位数-1”.即第1位是1-1 = 0次幂。

通常我们说的数值,表示的就是构成数值的各数位的数值和位权相乘后再相加的结果

移位运算和乘除运算的关系

二进制所特有的运算——移位运算

和十进制数一样,四则运算也可以使用在二进制数中。二进制中逢2进位。 二进制数所特有的运算,也是计算机所特有的运算,因此也可以说是了解程序运行原理的关键

移位运算

移位运算指的是将二进制数值得各数位进行左右移位的运算

  • 移位分为**左移(向高位方向)右移(向低位方向)**两种。在一次运算中,可以进行多个数位的移位操作。
  • 在C语言中左移使用<<运算符,右移时使用>>运算符。运算符的左侧被移位的值右侧要移位的位数

a = 39;
b = a << 2; // << 优先级高于=,a先左移2位,然后赋值给b
// b = a × 2 × 2 //参考十进制,数值向左移两位,变为原来数的 基数 * 基数(进制数中的基数)即2 * 2 = 4倍

移位操作的规则

  • 无论程序中使用的是什么进制,计算机内部都会将其转换成二进制数来处理。因此任何进制数也可间接实现移位操作。
  • 左移后空出来的低位要进行补0操作
  • 右移运算,用来填充右移后空出来的高位的数值,有0和1两种形式。
  • 移位操作使最高位或最低位一处的数字,直接丢弃就可以

移位操作的应用

移位运算可以通过数位移动来替代乘法运算和除法运算。
如将0010 0111(39)左移两位的结果是10011100(156),左移两位后数值变成了4倍。即39 * 4 = 156.
因此得出结论,二进制数左移后则变为原来的2倍、4倍、8倍...,右移后则变为原来的1/2,1/4,1/8.....

补数

右移运算,用来填充右移后空出来的高位的数值,有0和1两种形式。而到底补0还补1,只要掌握了用二进制数表示负数的方法即可。

二进制数表示负数

  • 二进制数中表示负数值时,一般会把最高位作为符号来使用,因此这个最高位也称为符号位
    符号位是0时表示正数,符号位是1时表示负数。
  • 计算机在做减法运算时,实际上内部是在做加法运算。为了实现这个目标,在表示负数时,要使用到二进制的补数。

补数

  • 补数就是用正数来表示负数。
  • 补数是二进制数的各数位的数值全部取反,再将结果加1

如,用8位二进制数表示-1,只需求得1,也就是0000 0001的补数即可。最终得到1111 1111。 而1 + (-1) = 0。刚好0000 0001(1)和补码1111 1111(-1)相加得到1 0000 0000(9位),根据移位操作规则可知,左移的最高位会被丢弃(即最高位溢出),对于溢出的位,计算机直接忽略掉。因此最终得到0000 0000。

  • 负数的实质就是在正数前面加个负号,因此负负得正。因此补数的补数就是正数。补数表示一个正数的负数形式,那么补数的补数就是这个负数的补数,即绝对值,即正数形式

3 -5
3的二进制形式 0000 0011;5 二进制形式 0000 0101 ;
-5则为5的补数形式 1111 1010
3 + (-5) 0000 0011 + 1111 1010 = 1111 1101
最高位为1表明结果是一个负数),因此根据负负得正的规则,补数的补数为正 0000 0010,得到2,因此3 + (-5) = -2

逻辑右移和算术右移的区别

负数右移的时候是算术右移

右移运算,负数右移的时候是算术右移,而因为正数无论是算术右移还是逻辑右移都是在最高位填充0,所以不用区分。另左移运算,无论正数还是负数,逻辑左移和算数左移也都是在最高位填充补0,所以也不用区分。

逻辑右移和算术右移的具体方法

  • 逻辑右移:当二进制数的值表示图形模式而非数值时,移位后需要在最高位补0,这种效果类似于霓虹灯字体那种整体在屏幕上右移。
  • 算数右移:将二进制数作为带符号的数值进行运算时,移位后要在最高位填充移位前符号位的值。负数则填充1,整数则填充0(另记住:在计算机中负数使用补数形式表示的)

-4(=1111 1100) >> 2 ,1111 1111(= -1) -4 /( 2 * 2) = -1

符号扩充

以8位二进制为例,符号扩充就是指在保持值不变的前提下将其转换成16位和32位的二进制数。
符号扩充的规则 不管是整数还是用补数表示的负数,都只需用符号位的值(0或1)填充高位即可。

0111 1111 转换成16位二进制
0000 0000 0111 1111
1111 1111(此为补数表示的形式) 转换成16进制
1111 1111 1111 1111

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部