Java:>>> operator vs 0xff

时间:2013-10-03 00:47:32

标签: java bit-manipulation bit-shift signed bits

任务是从给定的整数中获取每个字节。这是我在某处看到的方法:

byte[] bytes = new byte[4];
bytes[0] = (byte) ((id >> 24) & 0xff);
bytes[1] = (byte) ((id >> 16) & 0xff);
bytes[2] = (byte) ((id >> 8) & 0xff);
bytes[3] = (byte) (id & 0xff);

这将导致与此相同的分手:

bytes[0] = (byte) (id >>> 24);
bytes[1] = (byte) (id >>> 16);
bytes[2] = (byte) (id >>> 8);
bytes[3] = (byte) (id);

其中,id是一个整数值,ALWAYS是无符号的。事实上,我认为在第一种方法中不需要AND with 0xff(不是吗?因为我们总是使用最低有效字节)。

两种方法有什么不同,哪种方法更受欢迎?

1 个答案:

答案 0 :(得分:2)

您也不需要上部示例中的& 0xff,因为您的示例总是会删除符号扩展号与非符号扩展号中不同的位。

原因如下:当您使用n将数字右移>>位时,上部n位将获得与正在移位的数字的最高位相同的值。 >>>的行为的不同之处仅在于>>>强制将上n位置零。无论您使用的班次类型如何,较低的(32-n)位都是相同的。

您的示例中没有一个移位24位,因此如果您在底部示例中将>>>替换为>>,则较低的8位将相同。

由于完全没必要使用0xff进行屏蔽,因此我会使用>>>>>作为运算符的第二个代码段,因为代码更短。