数据是用二进制数表示的
在C和Java等高级语言编写的程序中,数值、字符串和图像等信息在计算机内部都是以二进制数值的形式来表现的。
用二进制数表示计算机信息的原因
IC(集成电路,Integrated Circuit)的所有引脚,只有直流电压0v和5v两个状态,所以计算机的信息数据只能用二进制数来处理。

- 计算机处理信息的最小单位–位(bit),就相当于二进制中的一位。
- 二进制的位数一般是8位、16位、32位……也就是8的倍数。
- 8位二进制数被称为一个字节。字节是最基本的信息计量单位。
- 程序中,即使是用十进制数和文字等记述信息,在编译后也会转换成二进制数的值。

什么是二进制数
二进制数的值转换成十进制数的值,将二进制数的各数位的值和位权相乘,然后将相乘的结果相加。

移位运算和乘除运算的关系
移位运算,将二进制数的各数位进行左右移位(shift)的运算。移位有左移(<<,向高位方向)和右移(>>,向低位方向)。<< 和 >> 运算符的左侧是被移位的值,右侧表示要移位的位数。
左移后空出来的低位,要进行补 0 操作。
a = 39;
b = a <<2;

通过数位移动来代替乘除运算。如上图
- 二进制数左移后变成原来的2倍、4倍、8倍……
- 二进制数右移后变成原来的1/2、1/4、1/8……
便于计算机处理的“补数”
- 二进制数中表示负数值时,一般会把最高位作为符号来使用,因此把这个最高位称为 符号位。
- 符号位为0时表示正数,为1时表示负数。
- 计算机在做减法运算时,是用加法运算来实现减法运算的。
- 在表示负数时就需要使用“二进制的补数”。补数,就是用正数来表示负数。
- 为了获得补数,需要将二进制数的各数位的数值全部取反,然后再将结果加 1。

将二进制数的值取反后加 1 的结果,和原来的值相加,结果为 0 。

若表示 3-5=-2,11111110的补数,取反加1后为 00000010。这个是2的十进制数。

逻辑右移和算术右移的区别
逻辑右移–当二进制数的值表示图形模式而非数值时,右移位后需要在最高位补 0 。

算术右移–将二进制数作为带符号的数值进行运算时,移位后要在最高位填充移位前符号位的值(0或1)。
- 如果数值是用补数表示的负数值,那么右移后在空出来的最高位补1,就可以正确地实现1/2、1/4、1/8等的数值运算。
- 如果是正数,只需在最高位补0即可。

只有在右移时,才必须区分逻辑位移和算术位移。左移时,无论是图形模式(逻辑左移)还是相乘运算(算术左移),都只需在空出来的低位补0即可。
符号扩充
在保持值不变的前提下将其转换成16位和32位的二进制数。

掌握逻辑运算的窍门
计算机能处理的运算,可分为算术运算和逻辑运算。
- 算术运算是指加减乘除四则运算。
- 逻辑运算是指对二进制数各数字位的0和1分别进行处理的运算,包括逻辑非(NOT运算)、逻辑与(AND运算)、逻辑或(OR运算)和逻辑异或(XOR运算)四种。
逻辑非,指0变1、1变0的取反操作。
逻辑与,指“两个都是1”时,运算结果为1,其他情况下运算结果都为0的运算。
逻辑或,指“至少有一方是1”时,运算结果为1,其他情况下运算结果都是0的运算。
逻辑异或,指排斥相同数值的运算。

掌握逻辑运算的窍门,把它看作是图形或是开关上的ON/OFF(1是ON,O是OFF)。
