/ / Pakowanie dwóch szortów w jedną int, radzenie sobie z negatywnymi i pozytywnymi - java, manipulacja bitami, podpis, pakowanie bitów

Pakowanie dwóch szortów w jeden int, radzenie sobie z negatywem i pozytywem - java, manipulacja bitami, podpisanie, pakowanie bitów

Tworzę klasę PackedUnsigned1616 któraprzechowuje dwa niepodpisane spodenki w jednej int i klasę PackedSigned1616, która przechowuje dwa podpisane spodenki w jednym int. Przeczytałem o operacjach bitowych, ale nadal jestem zdezorientowany, jak radzić sobie z podpisanymi i niepodpisanymi oraz wartościami, które są większe lub mniejsze niż krótki zakres (są przekazywane jako dwie liczby całkowite). Oto co Do tej pory mam:

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;
}

}

Cała ta koncepcja bardzo mnie dezorientuje, więc jeśli mógłbyś rzucić na nią trochę światła, bardzo by to pomogło.

Odpowiedzi:

8 dla odpowiedzi № 1

Ciekawy sposób na zainicjowanie LEWO i PRAWO. Spróbuj zamiast tego:

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;
}
}

Myślę, że w przypadku podpisanych wartości wystarczy zmodyfikować getLeft i getRight w następujący sposób:

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

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