Java按位向右移位255到字节值

时间:2012-09-30 16:39:23

标签: java bit-manipulation

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

因此,如果我有一个短值,我可以用两个字节来“打包”:

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,这对于java字节值来说意味着-1。我是否正确认为java如何解释它是无关紧要的,如果我发送为字节二进制11111111然后在另一端,它可以解释它,但它想要吗?

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:0)

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