首先:i<<33位相当于i<<1位。
下面是Thinking in java的一段:
如果对char,byte或者short类型的数值进行以为处理,那么在移位进行之前,他们会自动转换为int,并且得到的结果也是一个int类型的值,而右侧操作数,作为真正移位的位数,只有其二进制表示中的低5位才有用。这样可防止我们移位超过int类型值所具有的位数。(译注:因为2的5次方为32,而int类型只有32位)若对一个long类型的数值进行处理,最后得到的结果也是long。此时只会用到右操作数的低6位。以防止位移超过long类型数值具有的位数。 (page50)
针对楼主的问题:<<(左移运算符):是将左操作数向左移动右操作数指定的位数,右边移出的空位以0填充。当左操作数为int 时,移位运算符右侧的操作数只有低5位是有效的(低5位的十进制最大值为31) ,这只是为了避免全部移出失去意义。当大于32时同样适用。
当前题目中为计算 5<<33。而33的32位补码为
0000-0000 0000-0000 0000-0000 0010-0001 取其中的低5位即为00001,也就是十进制的1。即实际上只是左移1位。
所以 5<<33 相当于 5<<1。
5 的二进制为 0000-0000 0000-0000 0000-0000 0000-0101 = 5
左移一位即为 000-0000 0000-0000 0000-0000 0000-01010 = 10 |