【发布时间】: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