Java in think中有下面一句话:
若对char,byte 或者short 进行移位处理,那么在移位进行之前,它们会自动转换成一个int。只有右侧的5 个低位才会用到。这样可防止我们在一个int 数里移动不切实际的位数。
对上面那句话的理解是:移位操作符操作的对象是二进制的"位",int类型是32位,也就是2的32次幂。如果移动32位以上,原来的数的信息会全部消失,这样也就没有什么意义了。
所以上面的“只有右侧的5个低位才会有用”说的是:移位操作符右端的那个数(化成二进制)的低五位才有用,即x<<y,是指y的低5位才有用,即不能大于32。对于long也是同样道理。
因此,如果对一个int型进行移位,x<<y;
当y小于32时,移位后的结果一般都在能表示的范围,这时就先把y化成二进制数,然后取该二进制数的低5位,再把这5位化成十进制,此时这个十进制就是要对X移动的位数。
例如: int a = 140;
System.out.println(Integer.toBinaryString(a << 34));
上面这个语句的执行过程是:
先把a化成二进制数:1000 1100
执行语句 a << 34时,先把34化成二进制 10 0010,对该二进制数取低5位0 0010,化成十进制数2,所以实际上是对a左移2位。
现在地球人都知道结果是: 10 0011 0000