移位操作符

移位运算符就是在二进制的基础上对数学进行平移。按照平移的方向和填充数字的规则分为三种:<<(左移)、>>(右移)、>>>(无符号右移)。

Java 中的移位运算符也有三种:

  • << - 左移运算符
  • >> - 右移运算符
  • >>> - 无符号右移运算符

代码展示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 左移运算符
int a = 10; // 二进制 - 1010
a << 1; // 二进制 - 10100 - 相当于乘于 2^1

// 右移运算符
int a = 10;
a >> 1; // 二进制 - 101 - 相当于除于 2^1

// 无符号右移运算符 - 分两种情况:非负数与负数
// 非负数
int a = 10;
a >> 1; // 二进制 - 101 - 相当于除于 2^1

// 负数
int a = -10; // 二进制 - 11111111111111111111111111110110 - 负数在高位填补1
a >> 1; // 二进制 - 01111111111111111111111111111011 - 十进制 - 2147483643

以上代码中,十进制转换为二进制中,为什么int a = -10的二进制数的总长度为32呢。这取决于数据类型,在 java 中,基本数据类型int是4个字节,即32位。如果将数据类型int改变为long,结果则完全不同。

1
2
long a = -10;
a >> 1; // 十进制 - 9223372036854775803

优势

  • 移位运算是直接基于二进制对数值进行操作,主要目的是节约内存,运算时间比算术运算符更加快。


参考资料:

  1. https://baike.baidu.com/item/%E7%A7%BB%E4%BD%8D%E8%BF%90%E7%AE%97%E7%AC%A6
  2. http://www.cnblogs.com/hongten/p/hongten_java_yiweiyunsuangfu.html