无涯

无所谓无 无所谓有

Java移位运算

前言

最近在读JDK源码,发现HashMap里面存再大量的逻辑运算,而Java逻辑运算其实在我实际的开发当中用的相当的少,有些甚至还看不太懂,下面记录一些我读源码的时候遇到的一些逻辑运算。

>> 和 >>>

  • >>右移位符,该符号表示将二进制右移一位,不带符号位

  • >>>带符号右移位符,该符号表示将二进制右移一位,带符号位

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class JavaLogic {
public static void main(String[] args) {
int a = -10;
outBinaryString(a);
outBinaryString(a >> 1);
outBinaryString(a >>> 1);
}

public static void outBinaryString(int a) {
System.out.printf("%20d --> ", a);
print(a);
System.out.println();
}

public static void print(int num) {
for (int i = 31; i >= 0; i--) {
System.out.print((num & (1 << i)) == 0 ? "0" : "1");
}
}
}

运行Main方法打印出如下结果

1
2
3
       -10 --> 11111111111111111111111111110110
-5 --> 11111111111111111111111111111011
2147483643 --> 01111111111111111111111111111011

相关源码

java.util.HashMap#hash

1
2
3
4
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}