接着前面继续写。这次主要说明一下位运算符。
1. 与或非
在整型计算时,可以采用位运算,最典型的位运算是与(AND)、或(OR)、非(NOT),所有的操作都是按位进行。Java中与之对应的三个运算符分别是&,|,以及~。
例如,通过逻辑与提取某几个位,或者给某1个或及个位置1清0等。逻辑非运算是单目运算,用于取反,即将0变为1,将1变为0(也可以叫做toggle,翻转)。
int a=0b10100101;
System.out.println(Integer.toBinaryString(a & 0x07));//101
System.out.println(Integer.toBinaryString(a | 0x07));//10100111
System.out.println(Integer.toBinaryString(~a));//11111111111111111111111101011010
2. 异或
异或使用运算符^,同样按位操作,参与运算的两个bit位相同,则结果为0,如果不同,则结果为1。
当然,这些个位运算的操作,和C语言中没有太大的区别,这里就不再展开论述了。
3. 移位运算
首先,移位运算>>和<<和C语言中类似,其中,左移位运算(<<)很简单,在低位补0,x<<n的效果是x与2的n次幂相乘,但是右移位运算法(>>)会在高位补充符号位,因此,负数会在前面补充1,而正数在前面补充0。
Java还扩展了一个用0填充高位的运算符>>>,无论原来的数是正数还是负数,都会在高位补充0。测试代码如下:
System.out.println(Integer.toBinaryString(a));//11111111111111111111111111001110
System.out.println(Integer.toBinaryString(a <<1));//11111111111111111111111110011100
System.out.println(Integer.toBinaryString(a >>1));//11111111111111111111111111100111
System.out.println(Integer.toBinaryString(a>>>1));//1111111111111111111111111100111
System.out.println(a>>>1);//2147483623
可以看到,最后一个由于在最高位补了0,导致从一个很小的负数,变成了一个非常大的正数。