文章目录
计算机的数据是用二进制数表示的
0、热身问题
- 32位是几个字节?
4字节。 - 二进制 0101 1100 转换成十进制数是多少?
92。 - 二进制 0000 1111 左移两位后,会变成原来的几倍?
4倍。 - 补码形式表示的8位二进制数 1111 1111,用十进制数表示的话是多少?
-1。 - 补码形式表示的8位二进制数 1010 1010,用16位的二进制数表示的话是多少?
1111 1111 1010 1010。 - 反转部分图片模式时,使用的是什么逻辑运算?
XOR运算(逻辑异或运算)。
数值、字符串和图像等信息在计算机内部都是以二进制数值的形式来表现的。
1、用二进制数表示计算机信息的原因
计算机内部是由IC(集成电路)这种电子部件构成的,而IC的所有引脚只有0V和5V两种状态。
即IC的一个引脚,只能表示两种状态(高电平、低电平)。
IC的这个特性,决定了计算机内部的信息数据只能使用二进制数来处理。
39(十进制数) ----> 0010 0111(二进制)
'A'(文字) ----> 0100 0001(二进制)
2、什么是二进制数?
生活中最常使用的是十进制,即0~9,逢十进一。
所以“二进制数”简单理解就是:每个位的数值不超过1,即只有0、1。
二进制数 0010 0111 转十进制数的过程。
3、移位运算和乘除运算的关系
移位运算:将二进制数值的各数位进行左右移位的运算。
注意:无论程序中的数几进制的,在计算机内部都会转换为二进制数进行存储,因此都能进行移位运算。
我们将二进制数“0010 0111”左移两位后,其对应的十进制数会如何变化?
明显可以看出,二进制数左移2位后,其对应的十进制数等价于乘以4。
所以,二进制左移后就会变成原来的2倍、4倍、8倍……
同理,十进制左移后就会变成原来的10倍、100倍、1000倍……
后面我们会讲到,右移1位相当于除以2,注意是“算术右移”,我们后面会提到。
4、便于计算机处理的“补数”
二进制数表示负数时,会把最高位当作“符号位”来使用。
符号位是0表示正数,1则表示负数。
计算机在做减法运算时,实际内部做的“加法运算”。此时,就需要使用“二进制的补数”来表示负数了。
补数:用正数来表示负数,即负数以“其绝对值的补码形式”来表示。
如何求补数:将二进制数的各位取反再加1即可(按位取反+1)。
例如,使用8位二进制数来表示-1。
再举个例子,我们用16位二进制数来表示-100。
-100的绝对值是:100
100的原码:0000 0000 0110 0100
100的反码:1111 1111 1001 1011
100的补码:1111 1111 1001 1100
所以,-100的二进制表示为:1111 1111 1001 1100
接下来,我们再来说说,计算机用“加法操作”来完成“减法操作”。
以 “1-1 = 1 + (-1) = 0” 为例子。
当计算的结果为负数时,计算结果的值也是以“补数”的形式来表示,我们以“3 -5 = 3 + (-5) = -2”为例。
再来一个有趣的例子,我们都知道Java中的byte型占1个字节,而2^8 = 256,所以byte类型表示的范围是“-128 ~ 127”,那我们从0开始,一直+1,会出现什么情况呢?
@Test
public void test() {
int count = 0;
byte a = 0;
while (count != 257) {
System.out.printf("%-5d", a);
a++;
count++;
if (count % 15 == 0) {
System.out.println();
}
}
}
5、逻辑右移和算术右移的区别
右移有最高位补0和补1两种情况,右移分为逻辑右移和算术右移。
- 逻辑右移:高位补0
- 算术右移:正数,高位补0;负数,高位补1
以-4的逻辑右移2位和算术右移2位为例。
接着,顺便讲讲“符号扩充”。
符号扩充:在保持数值不变的情况下,将其转换成16位和32位的二进制数。
不管正负,只需要高位补“符号位”即可完成符号扩充。
6、掌握逻辑运算的窍门
算术运算:加减乘除的四则运算。
逻辑运算:对二进制数各数字位的0和1分别进行运算。
逻辑运算包括:
-
逻辑非(NOT运算)
A NOT A 1 0 0 1 -
逻辑与(AND运算
A B A AND B 0 0 0 0 1 0 1 0 0 1 1 1 -
逻辑或(OR运算)
A B A OR B 0 0 0 0 1 1 1 0 1 1 1 1 -
逻辑异或(XOR运算)
A B A XOR B 0 0 0 0 1 1 1 0 1 1 1 0
注:如有错误,敬请指正!