【问题标题】:Java bitwise right shift of 255 into byte valueJava按位右移255到字节值
【发布时间】:2012-09-30 16:39:23
【问题描述】:

我有一个短计数器,它递增并用作标识符。我需要将标识符作为二进制数据发送到网络套接字上。

因此,如果我有一个短值,我可以这样做以“打包”为两个字节:

short id = 1;
byte val = (byte)(id & 0xFF);
byte val2 = (byte)((id >>> 8) & 0xFF);
System.out.printf("id=%d, val = id & 0xFF = %d, val2 = (id >>> 8) & 0xFF = %d\n", 
                   id, val, val2);

现在当 id = 1 时,它可以正常工作。

但是当 id = 255 我得到:

short id = 255;
byte val = (byte)(id & 0xFF);           //val = -1
byte val2 = (byte)((id >>> 8) & 0xFF);  //val2 = 0

现在我知道二进制中的 255 是 11111111,这意味着 -1 表示 java 字节值。我是否正确地认为 java 如何解释它是无关紧要的,如果我以字节二进制 11111111 的形式发送,那么在另一端它可以随意解释它吗?

【问题讨论】:

  • val2 不是 -1,而是 0。您将所有 8 位移出该值,因此最终得到 0。
  • 对不起我的错误 - 我已经编辑了。
  • 顺便说一句,先做& 0xFF然后再转换成byte是多余的。换句话说,写(byte)(id >>> 8)就足够了。

标签: java bit-manipulation


【解决方案1】:

是的,你的想法是对的。

仅供参考:有一个非常好的课程可以为你做这件事。它被称为DataInputStreamDataOutputStream

Socket socket = ...;
DataInputStream dis = new DataInputStream(socket.getInputStream());
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());

/* Write a short */
short out = 255;
dos.writeShort(out);

/* Read a short */
short in = dis.readShort();

【讨论】:

  • 啊我只看了写。 writeShort 更容易。
【解决方案2】:

在 Java 中,所有数据类型都被解释为带符号的。也就是说,任何最高有效位等于 1 的数都是负数。当您通过网络发送数字时,Java 如何解释它并不重要,因为您仍然发送相同的位。所以是的,您的代码将按预期工作。

【讨论】:

  • Re:“所有数据类型都被解释为有符号”:char 除外,它是一个无符号的 16 位值。 :-)
猜你喜欢
  • 2014-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-04
  • 1970-01-01
  • 2015-10-24
相关资源
最近更新 更多