Упаковка двух шорт в один int, работа с негативом и позитивом - PullRequest
6 голосов
/ 09 мая 2011

Я делаю класс PackedUnsigned1616, который хранит два неподписанных шорта в одном int, и класс PackedSigned1616, который хранит два подписанных шорта в одном int.Я читал о побитовых операциях, но я все еще не понимаю, как обращаться со знаковыми и беззнаковыми значениями и значениями, которые больше или меньше, чем диапазон короткого замыкания (они передаются как две целые).Вот что у меня так далеко:

public final class PackedUnsigned1616 {
public final int field;

private static final int RIGHT = (2 << 15) - 1;
private static final int LEFT = ((2 << 31) - 1) ^ RIGHT;

public PackedUnsigned1616(int left, int right) {
    field = (left << 15) | (right & RIGHT);
}

public int getLeft() {
    return field >> 15;
}
public int getRight() {
    return field & RIGHT;
}

}

Вся эта концепция меня сильно смущает, так что, если бы вы могли пролить немного света на это, это бы очень помогло.

1 Ответ

8 голосов
/ 09 мая 2011

Интересный способ инициализации ВЛЕВО и ВПРАВО. Попробуйте вместо этого:

public final class PackedUnsigned1616 {
    public final int field;

    private static final int RIGHT = 0xFFFF;

    public PackedUnsigned1616(int left, int right) {
        field = (left << 16) | (right & RIGHT);
    }

    public int getLeft() {
        return field >>> 16; // >>> operator 0-fills from left
    }

    public int getRight() {
        return field & RIGHT;
    }
}

Для значений со знаком, я думаю, все, что вам нужно сделать, это изменить getLeft и getRight следующим образом:

    public int getLeft() {
        return field >> 16; // sign bit is significant
    }

    public int getRight() {
        return (short) (field & RIGHT); gets cast back to signed int
    }
...