我正在使用本地二进制模式(LBP),它产生0-255范围内的数字。这意味着它们可以放在一个字节中(256个不同的值可能包含在一个字节中)。这就解释了为什么我在java中发现许多(如果不是全部)实现使用byte[]
来存储这些值。
问题在于,由于我对转换为byte
(例如从int
)时这些值的秩感兴趣,因此它们不保持以前的秩(例如int
),因为字节是有符号的(我认为java中除了字符之外的所有字符),因此范围0-255的较大128值(127及之后)变成负数。此外,我认为它们的顺序是颠倒的(负的)。
一些更具体的例子:
(int) 0 = (byte) 0
(int) 20 = (byte) 20
(int) 40 = (byte) 40
(int) 60 = (byte) 60
(int) 80 = (byte) 80
(int) 100 = (byte) 100
(int) 120 = (byte) 120
(int) 140 = (byte) -116
(int) 160 = (byte) -96
(int) 180 = (byte) -76
(int) 200 = (byte) -56
(int) 220 = (byte) -36
(int) 240 = (byte) -16
我的问题是,当转换为byte
时,是否有一种特定的方法来维持int
值的顺序(意味着240 > 60
应该在byte
中也适用于-16 < 60
!),同时保持内存需求最小(意味着如果需要那么多,只使用8位)。我知道我可以考虑以更复杂的方式比较字节(例如,每个负>正,如果两个byte
s都是负的逆顺序),但我认为这并不令人满意。
除了(byte) i
,还有其他方法转换成byte
吗?
您可以从值中减去128:
byte x = (byte) (value - 128);
这将是保序的,并且稍后只需再加128即可逆转。不过要注意确保你的在后面添加了128。就像这样简单:
int value = x + 128;
例如,如果你想在int[]
和byte[]
之间进行可逆转换:
public byte[] toByteArray(int[] values) {
byte[] ret = new byte[values.length];
for (int i = 0; i < values.length; i++) {
ret[i] = (byte) (values[i] - 128);
}
return ret;
}
public int[] toIntArray(int[] values) {
int[] ret = new byte[values.length];
for (int i = 0; i < values.length; i++) {
ret[i] = values[i] + 128;
}
return ret;
}
如果你想保持原来的值,字节比较不需要特别复杂:
int unsigned1 = byte1 & 0xff;
int unsigned2 = byte2 & 0xff;
// Now just compare unsigned1 and unsigned2...