/ / Emballage de deux courts métrages dans un seul int, traitant des aspects négatif et positif - Java, manipulation de bits, signature, emballage de bits

Emballage de deux courts métrages dans un seul int, traitant des aspects négatif et positif - Java, manipulation de bits, signature, emballage

Je fais une classe PackedUnsigned1616 quistocke deux shorts non signés dans un int et une classe PackedSigned1616 qui stocke deux shorts signés dans un int. J'ai lu sur les opérations au niveau des bits, mais je ne comprends toujours pas comment traiter les valeurs signée et non signée, ainsi que les valeurs plus grandes ou plus petites qu'une plage courte (elles sont transmises sous la forme d'une valeur de deux pouces). J'ai "jusqu'à présent:

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

}

Ce concept me confond beaucoup, alors si vous pouviez nous éclairer un peu, cela nous aiderait énormément.

Réponses:

8 pour la réponse № 1

Manière intéressante d'initialiser GAUCHE et DROITE. Essayez ceci à la place:

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

Pour les valeurs signées, je pense que tout ce que vous avez à faire est de modifier getLeft et getRight comme suit:

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

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