如何在保持顺序的同时将int转换为byte

时间:2014-05-14 12:01:28

标签: java int byte signed

我正在使用局部二进制模式(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值的顺序(意味着byte240 > 60中也应该成立byte {{} 1)}!)同时保持内存需求最小(意味着如果需要那么多只使用8位)。我知道我可以考虑以更复杂的方式比较字节(例如,每个负数&gt;正数,如果两个-16 < 60 s都是负反转顺序)但我认为它并不那么令人满意。

除了byte之外还有其他方法可以转换为byte吗?

1 个答案:

答案 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...