向左移动位

时间:2017-11-17 18:26:11

标签: java

    byte right =0xf; // 00001111
    System.out.println(Integer.toBinaryString(right)); // 00001111

    right = (byte)(right << 4);
    System.out.println(Integer.toBinaryString(right)); // 11111111111111111111111111110000

为什么right等于11111111111111111111111111110000?我明确地将它转换为byte = 8位。

我正在考虑输出:11110000

1 个答案:

答案 0 :(得分:10)

如果你没有强制转换为byte,那么一切都会好的。

没有为byte定义的移位运算符,因此该值首先提升为int - 这很好,仍然是0000 [...] 1111。

然后向左移动4位,给出0000 [...] 111000。

然后转换为byte,给出一个11110000的字节。

然后调用Integer.toBinaryString,其中包含int参数。这意味着字节1111000被转换为int - 此时它被符号扩展为11111111111111111111111111110000(根据JLS 5.1.2),然后打印出来。

选项:

  • 请勿转到byte,因此您最终无法转换回int。 (例如,使用int shifted = right << 4;,然后将shifted传递给Integer.toBinaryString。)
  • 使用right & 0xff来应用位掩码,而不是隐式转换,因此您只能 设置最后8位。

其中任何一个都打印11110000。