5.7 位运算操作
Scala允许用若干位运算方法对整数类型执行位运算操作。位运算方法有:按位与(&)、按位或(|)和按位异或(^)。[8]一元的位补码操作(~,方法名为unary_~)对操作元的每一位取反。例如:
第一个表达式,即1 & 2会对1(0001)和2(0010)的每一位执行按位与操作,交出0(0000)。第二个表达式,即1 | 2会对同一组操作元的每一位执行按位或操作,交出3(0011)。第三个表达式,即1 ^ 2会对1(0001)和3(0011)的每一位执行按位异或操作,交出2(0010)。最后一个表达式,即~1会对1(0001)的每一位取反,交出-2,用二进制表示是这样的:11111111111111111111111111111110。
Scala整数类型还提供了3个位移(shift)方法,即左移(<<)、右移(>>)和无符号右移(>>>)。当位移方法被用在中缀操作符表示法时,会将左侧的整数值移动右侧整数值的量。左移和无符号右移方法会自动填充0。而右移方法会用左侧值的最高位(符号位)来填充。下面是一些示例:
-1用二进制表示是1111111111111111111111。在第一个例子中,-1 >> 31,-1被右移了31位。由于Int是32位的,这个操作实际上将最左边的位一直向右移动,直到它成为最右边的位。[9]由于右移方法在右移过程中用1来填充(因为-1的最左位是1),结果与原始的左操作元完全一致,即32个为1的位,也就是-1。在第二个例子中,-1 >>> 31,最左边的位再次被向右一直移动到最右边,不过这次填充的是0,因此结果是00000000000000000000000000000001,即1。在最后的示例中,1 << 2,左操作元1被左移了两个位置(用0填充),结果得到00000000000000000000000000000100,即4。