2011-05-08 13 views
6

Estoy haciendo una clase PackedUnsigned1616 que almacena dos pantalones cortos sin firmar en un int, y una clase PackedSigned1616 que almacena dos cortos firmados en un int. He leído sobre las operaciones a nivel de bit, pero todavía estoy confundido sobre cómo manejar firmado y sin firmar, y los valores que son más grandes o más pequeños que el rango de un corto (se pasan como dos entradas). Esto es lo que tengo hasta ahora:Embalaje de dos pantalones cortos en uno entero, con negativo y positivo

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 este concepto me está confundiendo mucho, por lo que si usted podría arrojar un poco de luz sobre ella, que ayudaría enormemente.

+1

bien lo que es el comportamiento deseado? El short más grande que puedes representar es '(2 << 15) -1 'así que si llamas al constructor con un número más grande que eso, ¿qué debería pasar? – MatrixFrog

+0

Oh, lo siento, quiero que se sujete –

+1

¿Es por diversión o para resolver un problema real? –

Respuesta

8

Interesante manera de inicializar IZQUIERDA y DERECHA. Prueba este lugar:

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 con signo, creo que todo lo que tiene que hacer es modificar getLeft y Getright de la siguiente manera:

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

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

¡Gracias! ¿Pero cómo voy a hacer PackedSigned1616? –

+0

@ cable729 - Respuesta revisada para mostrar la versión firmada –

+0

@Ted - He buscado la notación 0xFFFF en Internet. Es este hexadecimal? ¿Qué significa el 0x? Además, la función getLeft para la versión sin firmar no funciona. Use los valores (5, 32767), devuelve 10 y 32727. Lo mismo ocurre con (5, 32766) y (5, 27766) –

Cuestiones relacionadas