解决所有Java字节都已签名这一事实的最佳方法是什么?

时间:2020-03-05 18:39:38  来源:igfitidea点击:

在Java中,没有无符号字节之类的东西。

使用一些低级代码,有时我们需要使用无符号值大于128的字节,由于MSB被用作符号,因此Java会将其解释为负数。

解决此问题的好方法是什么? (说不使用Java不是一种选择)

解决方案

回答

我想你可以用一个短裤来存储它们。效率不是很高,但是除了我所看到的一些艰巨的努力,它实际上是唯一的选择。

回答

最好的选择是使用整数而不是字节。它有空间允许大于128的数字,而无需创建特殊对象来替换字节的开销。

比我聪明的人(所有人)也建议这样做

  • http://www.darksleep.com/player/JavaAndUnsignedTypes.html
  • http://www.jguru.com/faq/view.jsp?EID=13647

回答

从数组中读取任何单个值时,请将其复制到short或者int之类的值中,然后将负数手动转换为正值。

byte[] foobar = ..;
int value = foobar[10];
if (value < 0) value += 256 // Patch up the 'falsely' negative value

写入数组时,可以执行类似的转换。

回答

进行位操作/无符号字节的最佳方法是使用整数。即使它们是有符号的,它们也有大量备用位(总共32个)被视为无符号字节。同样,所有数学运算符都会将较小的固定精度数字转换为int。例子:

short a = 1s;
short b = 2s;
int c = a + b; // the result is up-converted
short small = (short)c; // must cast to get it back to short

因此,最好只是坚持使用整数并将其屏蔽以获取我们感兴趣的位。示例:

int a = 32;
int b = 128;
int foo = (a + b) | 255;

这是有关Java基本类型的更多信息http://mindprod.com/jgloss/primitive.html

最后一点,在Java中有一个无符号的固定精度数字。那就是char原语。

回答

使用int通常比使用short更好,因为java无论如何都在内部使用32位值(即使是字节,除非在数组中也是如此),因此使用int可以避免不必要的转换为字节码中的short值。

回答

如果这样做,实际上有可能摆脱if语句和加法。

byte[] foobar = ..;
int value = (foobar[10] & 0xff);

这样,Java不会将字节解释为负数,也不会翻转整数上的符号位。