简介
众所周知,在计算机中,任何对数的处理都会回归于对相应二进制数的处理。我们把这对应的二进制形式称为机器数(最高位储存符号,“0”是“+”,“1”是“-”),位运算可以对机器数直接进行一元操作(有一个被处理数)或二元操作(有两个)。在平时,位运算比部分正常运算略快;不过当问题本身涉及到对二进制数的转化与处理时,位运算更能发挥巨大的作用。
位运算符简介
- 左移运算符 <<
对于一个二进制数,我们使用左移操作,它包含被操作值和移位值,左移操作就是将该数每一位上的数向左移动移位值,如0000 0000 0000 0011(3)向左移位1一位成为0000 0000 0000 0110(6).
v<
上述代码展示了左移运算符的使用,v是被操作的整数值,s是移动位数。
对于二进制数,我们知道每一位上等于右边一位的两倍。那么,左移一位即等于乘2。那么3<<1便等价于(1×2^1+1×2^0)×2=6。位移n位,以此类推,等于原值的2^n倍。- 右移运算符 >>
v>>s
据左移运算符的功能类推可知,右移运算符即将每一位右移n位。位移后的值等于原值的1/2^n倍。
对于位移运算符,位移后腾出的位置用“0”填充,超出边界的值舍弃。- 按位反运算符 ~
位反运算符将每一位转换为它的反面,如“0”变为“1”,而“1”变为“0”。
- 按位或运算符 |
对两个等长二进制整数值操作,若两个数的对应位中只要有一个及以上的“1”,结果新值中此位为“1”,其余情况此位则为“0”。
- 按位异或运算符 ^
对两个等长二进制整数值操作,若两个数的对应位中只有一个为“1”,新值相应位为“1”,而若都是“0”或“1”,相应位为“0”。
- 按位与运算符 &
对两个等长二进制整数值操作,若两个数的对应位中两个都是“1”,新值相应位为“1”,其余情况新值相应为皆为“0”。
附
在位运算中,对于负数还有一道特殊的处理工序。对于负数相应的二进制数,需要被当成补码来处理,位运算时是对相应的补码进行各种运算。而输出时又要将已经进行过位运算的补码,再转为原码进行输出。