0%

搞懂位移运算

搞懂了上篇文章,这篇就会比较容易。上篇文章传送门:搞懂原码、反码、补码

在 Java 中有三个位移运算:

  1. <<:左移
  2. >>:右移
  3. >>>:无符号右移

正数位移运算

首先来看结果:

正数位移运算结果

十进制 2 转换为二进制原码、反码、补码都为 00000000 00000000 00000000 00000010

2 << 1

  • 符号位固定不动,二进制左移一位,高位丢弃,低位补 0,结果为 00000000 00000000 00000000 00000100
  • 其反码、原码都和该补码一样
  • 换算成十进制为 4

2 >> 1:

  • 符号位固定不动,二进制右移一位,低位丢弃,高位补 0,结果为 00000000 00000000 00000000 00000001
  • 其反码、原码都和该补码一样
  • 换算成十进制为 1

负数位移运算

首先来看结果:

负数位移运算结果

十进制 -2 转换为二进制原码为 10000000 00000000 00000000 00000010,反码为 11111111 11111111 11111111 11111101,补码为 11111111 11111111 11111111 11111110

-2 << 1:

  • 符号位固定不动,二进制左移一位,高位丢弃,低位补 0,结果为 11111111 11111111 11111111 11111100
  • 该补码对应的反码为 11111111 11111111 11111111 11111011
  • 该反码对应的原码为 10000000 00000000 00000000 00000100
  • 换算成十进制为 -4

-2 >> 1:

  • 符号位固定不动,二进制右移一位,低位丢弃,高位补 1,结果为 11111111 11111111 11111111 11111111
  • 该补码对应的反码为 11111111 11111111 11111111 11111110
  • 该反码对应的原码为 10000000 00000000 00000000 00000001
  • 换算成十进制为 -1

无符号右移

首先来看结果:

无符号右移结果

前面 << 和 >> 都是符号位固定不动,而无符号右移则是符号位跟着一起右移。

十进制 2 转换为二进制补码为 00000000 00000000 00000000 00000010;十进制 -2 转换为二进制补码为 11111111 11111111 11111111 11111110

2 >>> 1:

  • 二进制符号位跟着右移,低位丢弃,高位补 0,结果为 00000000 00000000 00000000 00000001
  • 其反码、原码都和该补码一样
  • 换算成十进制为 1

-2 >>> 1:

  • 二进制符号位跟着右移,低位丢弃,高位补 0,结果为 01111111 11111111 11111111 11111111
  • 其反码、原码都和该补码一样
  • 换算成十进制为 2147483647

无符号右移有个经典应用,在之前二分查找的文章中也说过,就是求两个整数的平均值:int mid = (l + r) >>> 1

位移运算,你搞懂了吗?


欢迎关注我的其它发布渠道