解决所有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不会将字节解释为负数,也不会翻转整数上的符号位。