异或运算符 ^
异或运算符是用符号“^”表示的,其运算规律是:
两个操作数的位中,相同则结果为0,不同则结果为1。下面看一个简单的例子。
public class Test {
public static void main(String[] args) {
System.out.println(5 ^ 3);//结果为6
}
}
将2个操作数和结果都转换为二进制进行比较:
5转换为二进制:0000 0000 0000 0000 0000 0000 0000 0101
3转换为二进制:0000 0000 0000 0000 0000 0000 0000 0011
结果为6:
6转换为二进制:0000 0000 0000 0000 0000 0000 0000 0110
在阅读源码的过程中,经常会看到这些符号<< ,>>,>>>,这些符号在Java中叫移位运算符,在写代码的过程中,虽然我们基本上不会去写这些符号,但需要明白这些符号的运算原理,比如HashMap中有以下代码:
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;//左移
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);//无符号右移
}
左移运算符:<< 先随便定义一个int类型的数int,十进制的value = 733183670,转换成二进制在计算机中的表示如下:
value << 8,左移8位看一下:
右移运算符:>>
还是这个数:733183670
value >> 1,右移1位
value >> 8,右移8位看一下
综上所述:右移运算符>>的运算规则也很简单,丢弃右边指定位数,左边补上符号位。
无符号右移运算符:>>> 无符号右移运算符>>>和右移运算符>>是一样的,只不过右移时左边是补上符号位,而无符号右移运算符是补上0,也就是说,对于正数移位来说等同于:>>,负数通过此移位运算符能移位成正数。以-733183670>>>8为例来画一下图
无符号右移运算符>>>的运算规则也很简单,丢弃右边指定位数,左边补上0。
参考: zhuanlan.zhihu.com/p/30108890 blog.csdn.net/xiaochunyon… blog.csdn.net/vebasan/art…