/ / Empacotando dois shorts em um int, lidando com negativo e positivo - java, manipulação de bits, assinado, empacotamento de bits

Embalando dois shorts em um int, lidando com negativo e positivo - java, bit-manipulação, assinado, bit-packing

Estou criando uma classe PackedUnsigned1616 quearmazena dois shorts não assinados em um int e uma classe PackedSigned1616 que armazena dois shorts assinados em um int. Eu li sobre operações bit a bit, mas ainda estou confuso sobre como lidar com valores assinados e não assinados e que são maiores ou menores que um intervalo curto (eles são passados ​​como duas polegadas). Aqui está o que Eu cheguei até agora:

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

}

Todo esse conceito está me confundindo muito; portanto, se você pudesse lançar um pouco de luz, isso ajudaria tremendamente.

Respostas:

8 para resposta № 1

Maneira interessante de inicializar ESQUERDA e DIREITA. Tente isso:

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

Para valores assinados, acho que tudo que você precisa fazer é modificar getLeft e getRight da seguinte maneira:

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

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