5.7 位运算操作
Scala允许你用若干位运算方法对整数类型执行位运算操作。位运算方法有:按位与(&)、按位或(|)和按位异或(^)。[5]一元的位补码操作(~,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整数类型还提供了三个位移(shift)方法,左移(<<)、右移(>>)和无符号右移(>>>)。当位移方法被用在中缀操作符表示法时,会将左侧的整数值移动右侧整数值的量。左移和无符号右移会自动填充0。而右移会用左侧值的最高位(符号位)来填充。以下是一些示例:
-1用二进制表示是11111111111111111111111111111111。在第一个例子中,-1 >> 31,-1被右移了31位。由于Int是32位的,这个操作实际上将最左边的位一直往右移动,直到它成为最右边的位。[6]由于>>方法在右移过程中用1来填充(因为-1的最左位是1),结果跟原始的左操作元完全一致,32个为1的位,也就是-1。在第二个例子中,-1 >>> 31,最左边的位再次被往右一直移动到最右边,不过这次填充的是0,因此结果是00000000000000000000000000000001,即1。在最后的示例中,1 << 2,左操作元1被左移了两个位置(用0填充),结果得到00000000000000000000000000000100,即4。