



理解了二进制的原理之后,我们来看一看运算。二进制的四则运算和十进制相同,只要注意逢二进一这个规则就可以了。这里笔者要介绍一种二进制特有的运算。二进制特有的运算就是计算机特有的运算,这一点是理解程序工作原理的关键。
首先我们来看移位运算。 移位运算 是一种对二进制数的各位数字进行平移(shift)的运算。将各位数字向左(高位)移位称为 左移 ,向右(低位)移位称为 右移 。一次运算可以对数字平移多位。
代码清单 2-1 中的这段 C 语言程序,其功能是将十进制数 39 赋值给变量 a ,然后将其左移 2 位,再将结果赋值给变量 b 。运算符<< 代表左移运算,右移运算的运算符是 >>。<< 运算符和 >> 运算符的左侧是要进行移位运算的数,右侧是要平移的位数。大家知道运行这个程序后,变量 b 的值是多少吗?
代码清单 2-1 将变量 a 的值左移 2 位的 C 语言程序
a = 39;
b = a << 2;
   如果有人认为移位运算是对二进制数进行移位,对十进制数 39 进行移位运算没有意义,那么笔者觉得他应该重读一下本章的内容。无论程序中的数使用几进制来表示,在计算机内部都会转换成二进制来处理,因此这类数是可以进行移位运算的。有人可能会问左移之后空出来的低位应该填什么数字,笔者觉得提出这个问题的人非常敏锐。空出来的低位会用 0 来填充。但这只适用于左移的情况,至于右移运算中空出来的高位应该如何处理,我们稍后再看。此外,在移位运算中,最高位或最低位多出来的数字(称为 溢出 )会被直接舍弃。
我们继续看代码清单 2-1。十进制数 39 用 8 位二进制表示就是 00100111,因此左移 2 位之后的结果是 10011100,转换成十进制数后是 156( 图 2-4 )。这里我们不考虑数的符号,原因后面再讲。
    图 2-4 左移 2 位的运算
移位运算以及本章最后要介绍的逻辑运算,在实际的程序中都能发挥很重要的作用,因为计算机是以比特为单位来处理信息的。这里我们不展示具体的程序示例,不过理解移位运算和逻辑运算的原理是程序员必须要掌握的基本功。直观上说,移位运算有点类似于由二进制数组成的点阵图案像霓虹灯牌一样左右滚动的感觉。
通过数位的移动,移位运算也可以用来代替乘法运算和除法运算。例如,00100111 左移 2 位的结果是 10011100,这意味着左移后的结果是原数的 4 倍。从十进制的角度来看,数值从 39(00100111)变成了 156(10011100),我们可以发现数值正好是原来的 4 倍(39 × 4 = 156)。
仔细思考一下就会发现,这是理所当然的事情。在十进制下将数字左移,数值就会变成原来的 10 倍、100 倍、1000 倍……同样,在二进制下将数字左移,数值就会变成原来的 2 倍、4 倍、8 倍……相反,在二进制下将数字右移,数值就会变成原来的 1/2、1/4、1/8……通过这个例子我们可以发现,移位运算可以代替乘法运算和除法运算。