1、^(异或运算符)

运算规则:相同则为0,相异则为1
如:1010 ^ 1011 = 0001

2、&(与运算符)

运算规则:相同则为1,相异则为0
如:1010 & 1011 = 1010
另外&还能用于取余:x & (y-1)

3、| (或运算符)

运算规则:有一个为1,则为1,否则为0
如:1010 | 1011 = 1011


以下三种运算符都是位运算符

>>x(常数): 向右移动x位(顶点在哪个方向就往哪个方向移动),如果该数是正数,则高位(最左边)补x个0,如果是负数,则最高位补x个1。

<<x(常数): 向左移动x位(顶点在哪个方向就往哪个方向移动),无论正负数低位(最右边)都补x个0。

<<<: 无该表示方式。

>>>x(常数): 表示无符号右移x位,所谓无符号是与>>x对比,该操作在移动后,无论正负数高位(最左边)都补0。

4. <<(左移运算符)

举例1:-20<<2
原码:10000000 00000000 00000000 00010100

反码: 11111111 11111111 11111111 11101011(符号位不变,其他位取反)

补码: 11111111 11111111 11111111 11101100(反码 + 1)

左移两位(最右边两位添0)

补码: 11111111 11111111 11111111 10110000

反码: 11111111 11111111 11111111 10101111(补码 - 1)

原码: 10000000 00000000 00000000 01010000(符号位不变,其他位取反)

结果:-80

举例2:20<<2
原码(反码,补码):00000000 00000000 00000000 00010100

左移两位(最右边两位添0)

原码(反码,补码):00000000 00000000 00000000 01010000

结果:80

5. >>(右移运算符)

举例1:-20>>2
原码:10000000 00000000 00000000 00010100

反码: 11111111 11111111 11111111 11101011(符号位不变,其他位取反)

补码: 11111111 11111111 11111111 11101100(反码 + 1)

右移两位(最左边两位添1)

补码: 11111111 11111111 11111111 11111011

反码: 11111111 11111111 11111111 11111010(补码 - 1)

原码: 10000000 00000000 00000000 00000101(符号位不变,其他位取反)

结果:-5

举例2:20>>2
原码(反码,补码):00000000 00000000 00000000 00010100

右移两位(最左边两位添0)

原码(反码,补码):00000000 00000000 00000000 00000101

结果:5

6. >>>(无符号右移运算符)

举例1:-2>>>1
原码:10000000 00000000 00000000 00000010

反码: 11111111 11111111 11111111 11111101(符号位不变,其他位取反)

补码: 11111111 11111111 11111111 11111110(反码 + 1)

右移1位(无符号位运算符,最左边一位只添0)

补码: 01111111 11111111 11111111 11111111

反码: 01111111 11111111 11111111 11111111(高位为0,正数)

原码: 01111111 11111111 11111111 11111111(与反码相同)

结果:2147483647

举例2:2>>>1
原码(反码,补码):00000000 00000000 00000000 00000010

右移一位(最左边一位添0)

原码(反码,补码):00000000 00000000 00000000 00000001

结果:1

7、&& (逻辑与运算符)

运算规则:符号两边全为真是则为真,否则为假。
&也可以做为逻辑与运算符,区别在于&会判断两边,而&&如果左边为假,右边就不执行了。因此&&也称为短路与

8、|| (逻辑或运算符)

运算规则:符号两边有一个为真则为真,否则为假
| 也可以做为逻辑与运算符,区别在于 | 会判断两边,而 || 如果左边为假,右边就不执行了。因此 || 也称为短路或。