“<<”, “>>”, “>>>”在Java中是左移、有符号右移和无符号右移运算符。位移运算符只对int值进行操作,如果不是int,编译器会报错。在Java中,一个int的长度始终是32bit,也就是4个字节。
比如t>>>n的含义就是把整数t右移n位,高位补上零。所以如果t是个负数,最高位是1,那么经过无符号右移之后,就成了一个正数。比如 -1>>>31=1。
值得注意的是,虚拟机在进行位移操作之前,把位移的位数(即“t>>>n”中的n)对32取了模,左移或右移33位等价于移动1位,而且无论任何数,使其移动32位,其值都不会发生变化。因为在虚拟机看来,t>>>32与t>>>0是等价的(同理t<<32等价于t<<0)。移动64位也是如此,以此类推。
那如果移动的位数 n 是负数怎么办呢?。 这时虚拟机会先让n对32取模,变成一个绝对值小于32的负数,然后再加上32,直到 n 变成一个正数。比如(k>>>-1) ==> (k>>>31); (k>>-43) ==> (k>>-11) ==> (k>>>21)。