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/

10-13 04:13