我只是坚持这个我没有做对的小逻辑int
是 32 位,所以假设在二进制中取 20 就像
// 00000000000000000000000000010100
..现在如果我执行右移操作说4
int a = 20>>4;
// 00000000000000000000000000000001
..所以结果是1
现在说我再次取 20 并做 5 次右移操作
int b = 20>>5; //00000000000000000000000000000000
..所以结果是0
现在,如果我右移 32 次……为什么我得到的数字与我分配的数字相同。??
int c = 20>>32; //how does this prints 20 again??
System.out.println("right shift 4= "+a+"\n right shift 5= "+b+"right shift 32 = "+c);
所以我期待的是在 5 个类次之后 .. 任何数量的类次都应该导致结果 0 .. 但是在 32 个类次中为什么我要取回指定的值?
最佳答案
JLS 15.19。移位运算符
如果左侧操作数的提升类型是 int,则仅将右侧操作数的五个最低位用作移位距离。就好像右手操作数受制于掩码值为 0x1f (0b11111) 的按位逻辑 AND 运算符 &(第 15.22.1 节)。因此实际使用的移动距离总是在 0 到 31 的范围内,包括 0 到 31。
如果左侧操作数的提升类型为 long,则仅将右侧操作数的 6 个最低位用作移位距离。就好像右手操作数受制于掩码值为 0x3f (0b111111) 的按位逻辑 AND 运算符 &(第 15.22.1 节)。因此实际使用的移位距离总是在 0 到 63 的范围内,包括
关于java - Java中的右移,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22267290/