2013-10-03 70 views
1

任务是从给定的整数中获取每个字节。这是我看到某处的办法:Java:>>> operator vs 0xff

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(不是吗?因为我们总是使用最低有效字节)。

这两种方法有什么区别,哪一种更受欢迎?

+0

“id是一个整数值,并且总是无符号的”int“总是用Java签名。你的意思是说这是积极的吗?不过,这并不重要。两种方法都是相同的 - 即使用'>>'而不是'>>>' – leonbloy

+0

我的意思是,我知道id将保存的值,它永远不会保留负整数。 – user1071840

回答

2

在上面的示例中,您不需要& 0xff,因为您的示例总是切掉符号扩展数与非符号扩展数不同的位。

这是为什么:当你使用>>n位右移了一些,因为一些最显著位被转移上n位将得到相同的值。 >>>的行为不同之处仅在于>>>强制上位n位为零。无论您使用的班次种类如何,更低的(32-n)位都是相同的。

没有一个例子的位移量增加了24位,所以如果在底部示例中用>>代替>>>,那么较低的八位将是相同的。

因为完全没有必要用0xff进行掩码,所以我会使用第二个片段,使用>>>>>作为运算符,因为代码更短。

+0

这正是我的想法。非常感谢您的确认。这是一个非常基本的和极其重要的疑问。 – user1071840