- 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