我正在使用局部二进制模式(LBP),它产生0-255范围内的数字。
这意味着它们可以适合一个字节(一个字节可以包含256个不同的值)。这就解释了为什么我发现java中的许多(如果不是全部)实现使用byte[]
来存储这些值。
问题在于,由于我在转换为byte
(例如来自int
)时对这些值的排名感兴趣,因此他们不会保留以前的排名({{1}例如)因为字节是有符号的(因为我认为除了字符串之外的所有字符),因此0-255范围内的128个值(127和之后)变为负数。此外,我认为它们按顺序颠倒(负面的)。
更具体的一些例子:
int
我的问题是,在转换为(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
时,是否有一种特定的方法可以维持int
值的顺序(意味着byte
在240 > 60
中也应该成立byte
{{} 1)}!)同时保持内存需求最小(意味着如果需要那么多只使用8位)。我知道我可以考虑以更复杂的方式比较字节(例如,每个负数&gt;正数,如果两个-16 < 60
s都是负反转顺序)但我认为它并不那么令人满意。
除了byte
之外还有其他方法可以转换为byte
吗?
答案 0 :(得分:4)
您可以从值中减去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...