前言
Java中的移位操作主要包括三种:<<(左移)、>>(有符号右移)、>>>(无符号右移)。这三种移位操作都只能作用于long
、int
、short
、byte
、char
这五种基本的整型类型上,由于 double
,float
在二进制中的表现比较特殊,因此不能来进行移位操作。通常情况下,移位操作比普通运算的效率更高。
左移 <<
左移运算是将数据的二进制数向左移动若干位,高位丢弃,低位补零,如:
1 | int a = -1; |
有符号右移 >>
有符号右移是将数据的二进制数向右移动若干位,低位丢弃,高位补符号位,如:
1 | int a = 8; |
无符号右移 >>>
无符号右移是将数据的二进制数向右移动若干位,低位丢弃,高位补0,如:
1 | int b =-8; |
可以发现正数的>>和>>>是等价的
坑
对 short、byte、char 的移位操作
java对short、byte和char的移位操作,首先会将其补成32位的int型,再对其进行移位操作,最后低位截取对应的位数,比如:
1 | byte a = -2; |
注意,如果输出a >> 3,此时不会对结果进行截取。只有a >>= 3,即对a赋值的时候才会进行低位截取,比如此时a是byte类型,在java中占8位,就对移位后的结果取低8位赋给a
移位的位数超过数值所占有的位数
对于要移动的位数i,如果i超过了该类型数值所占位数j,则取i%j的结果作为最终要移动的位数,其中short、byte和char类型总是会先转化为32位int,比如:
1 | byte c = 1; |