基本的C++位运算符有:&(与)、|(或)、~(取反)、^(异或)、>>(右移)、<<(左移)等,众所周知,采用位运算可以极大的提高代码的运行效率。如果有的程序需要处理海量数据,其中又涉及大量简单的加减乘除运算,则可以用位运算来进行操作,减少程序的执行时间。
例如,a<<n表示将a的值左移n位,相当于将a乘以2的n次方,若有如下语句:
int a=5,b;
b=a<<3;
cout<<"b="<<b<<endl;
输出结果为:b=40
即b=a<<3等价于b=a*8。由此看来,对于一个数a乘以一个数b,若b能够表示成2的n次方的形式,只要采用左移运算即可(但是值得注意的是,要避免溢出!)。
这里有个问题,那就是如果乘数不是2的n次方的形式该怎么办?解决的方法其实很简单,只要将所要乘的数分解为几个2的n次方相加的形式即可。例如,计算b=a*20,因为20等于2的4次方加2的2次方,所以b=a*20等价于如下的位运算表达式:b=(a<<4)+(a<<2)。
那么,如果乘数是负数时又该怎么办呢?因为负数在计算机中的存储方式为补码的形式,所以对任意的整数,如下的等式:(~a)+a+1=0恒成立。公式中用到了