byte right =0xf; // 00001111
System.out.println(Integer.toBinaryString(right)); // 00001111
right = (byte)(right << 4);
System.out.println(Integer.toBinaryString(right)); // 11111111111111111111111111110000
为什么
right
等于11111111111111111111111111110000
?我明确将其转换为字节= 8位。我期待一个输出:
11110000
。 最佳答案
如果您没有转换为byte
,一切都会好起来的。
没有为byte
定义的移位运算符,因此该值首先提升为int
-可以,但仍为0000 [1111]。
然后,您左移4位,得到0000 [... 111000]。
然后将其强制转换为byte
,得到11110000字节。
然后,调用Integer.toBinaryString
,它采用一个int
参数。这意味着将字节1111000转换为int
-然后将其符号扩展到11111111111111111111111111111110000(根据JLS 5.1.2),然后将其打印出来。
选项:
不要将其转换为byte
,这样就不会导致转换回int
。 (例如,使用int shifted = right << 4;
,然后将shifted
传递到Integer.toBinaryString
。)
不要使用隐式转换,而使用right & 0xff
来应用位掩码,以便只能设置低8位。
这些打印中的任何一个都将代替11110000。
关于java - 向左移动位,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47357021/