如何在保持顺序的情况下将整型转换为字节



我正在使用本地二进制模式(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...

相关内容

  • 没有找到相关文章

最新更新