Java中的三个移位运算符:">>","<<",">>>"分别有其各自的意义
1. ">>"表示将一个二进制表示的数字进行右移操作,如n>>2,相当于将数字n右移两位,也就是将n除以4的结果。
2."<<"表示将一个二进制表示的数字进行左移操作,如n<<2,相当于将数字n左移两位,也就是将n乘4的结果。
在执行以上位移操作时,由于计算机中使用补码存储数字,对于正数来说,补码等于原码,所以直接进行相应的左移或者右移操作,并在高位或者低位补上即可,特别要注意的是,右移操作时,低位直接舍去;而左移操作时舍去高位会发生溢出使结果出错。如:有一个八位二进制数0100 1010,右移两位变为0001 0010,相当于原数除以4;左移两位变为0010 1000结果溢出。
对于负数来说,补码等于原码按位取反后,末位加1,且最高位为符号位。这时进行位移操作,当右移时高位补充符号位即补1,左移时低位补0。如八位二进制数1100 0100,左移一位后为1000 1000,右移一位后为1110 0010,原数为-60,左移后为-120,右移后为-30。
3.">>>"表示无符号数的右移操作,因为忽视符号位,所以在高位一律补0。
有时我们还会遇到类似于&0xFF这样的操作,如 n = n & 0xFF,这又代表什么呢?
首先解释一下0xFF,这代表的是十六进制数FF即1111 1111,对应十进制即为255,当一个数n对这个 0xFF 作 & 操作时,相当于求n除以256所得的余数,也就是相当于n%256。
设一个十六位二进制数1010 1100 0100 0001要作&FF操作,即将这两个数按位“与”
1010 1100 0100 0001
0000 0000 1111 1111
所的结果为0000 0000 0100 0001
可以看到这个数即为1010 1100 0100 0001除以256的余数。
同理&0x03、&0x0F即为求一个数除以4、除以16所得的余数。