Java 位运算

208 阅读3分钟

异或运算符 ^


异或运算符是用符号“^”表示的,其运算规律是:
两个操作数的位中,相同则结果为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 << 1,左移1位

左移1位后换算成十进制的值为:1466367340,刚好是733183670的两倍, 有些人在乘2操作时喜欢用左移运算符来替代。

value << 8,左移8位看一下:

左移8位后变成了十进制的值为:-1283541504,移动8位后,由于首位变成了1,也就是说成了负数,在使用中要考虑变成负数的情况。

右移运算符:>>

还是这个数:733183670

value >> 1,右移1位

右移1位后换算成十进制的值为:366591835,刚好是733183670的1半, 有些人在除2操作时喜欢用右移运算符来替代

value >> 8,右移8位看一下

综上所述:右移运算符>>的运算规则也很简单,丢弃右边指定位数,左边补上符号位。

无符号右移运算符:>>> 无符号右移运算符>>>和右移运算符>>是一样的,只不过右移时左边是补上符号位,而无符号右移运算符是补上0,也就是说,对于正数移位来说等同于:>>,负数通过此移位运算符能移位成正数。以-733183670>>>8为例来画一下图

无符号右移运算符>>>的运算规则也很简单,丢弃右边指定位数,左边补上0。

参考: zhuanlan.zhihu.com/p/30108890 blog.csdn.net/xiaochunyon… blog.csdn.net/vebasan/art…