java-移位操作符

在java代码优化时一般会遵循一个原则, 尽量使用移位来代替’a/b’和’a*b’的操作,这两个操作代价很高,使用移位操作将会更快更有效。

1、三种移位操作

  • “<<” 不带符号左移,符号位不动,低位补0,高位丢失
  • “>>” 不带符号右移,符号位不动,正数高位补0,负数高位补1(机器数为补码),低位丢失
  • “>>>” 带符号右移,高位补0,低位丢失

2、五种左操作数类型

左操作数有五种:long, int, short, byte, char

  1. int 移位时左操作数是32位的,此时移位操作作用到32bit上
  2. long 移位时做操作数是64位的,此时移位操作作用到32bit上
  3. short byte char 在移位之前先将左操作数转换成int,然后在32bit上进行移位最终得到一个int类型,所以用>>=,>>>=, <<= 其实是将得到的int做低位截取得到的数值,这里往往容易犯错。

3、右操作数有坑

  • 如果左操作数(转换之后的)是int,那么右操作数只有低5位有效,因为int只有32位,低5位最多可以移动31位
  • 如果左边操作数是long,那么右边操作数只有低6位有效,同理

4、移位操作是对补码进行的

  • 正数的 补码 = 原码
  • 负数的 补码 = 反码 + 1
  • 补码的补码等于原码