operador java type-conversion bit-manipulation short

operador - Java En AND''ing un corto con un corto, se actualiza a int y devuelve valores extraños



java bit operations (4)

Estoy creando una máscara y estableciendo bits más altos en un corto como este:

enum FLAGS {FLAG1, FLAG2, FLAG3, FLAG4, FLAG5, FLAG6}; public static void setFlag(short len, FLAGS flag) { short mask = 1 << (Short.SIZE - flag.ordinal() - 1); len |= mask; }

Imprimí los valores:

len: 0000001111111100 mask : 1000000000000000 after OR''ing with mask: 11111111111111111000001111111100

Entiendo que cuando hacemos una manipulación de bit en los cortos, están upgded a int para evitar el desbordamiento, pero ¿por qué entonces se establecen todos los bits más altos? ¿Cómo puedo simplemente configurar cualquiera de los primeros 6 bits sin ningún tipo de fundición divertida?


Cuando el short se convierte a int , se conserva su valor numérico. Si el bit más alto es 1, el short es un número negativo, y para preservar su valor, el int debería ser negativo, es decir, el bit más alto del int debería ser 1 también, y también lo serían todos los bits entre.

En general, al convertir un short en un int , los números negativos se completan a la izquierda con 1 y los positivos se rellenan con 0.


Parece que estás OR ''no estás AND''. ''|'' es o, ''y'' es y. También estás en quirófano y corto, no corto ni corto. Su declaración impresa incluso dice OR, mientras que su título dice AND. Si usa ''& ='', creo que resolverá su problema.


short está firmado, y su máscara es negativa. Eso se conserva cuando se amplía a int . Puede enmascarar la máscara con los bits más altos:

len |= (mask & 0xffff);

Ahora, eso sería si len fuera un int o long , pero dado que es corto, no tendrá esos bits más altos de todos modos. Entonces realmente la ampliación está sucediendo en alguna otra parte de tu código.


Simplemente devuelve el resultado al resumen. Obtendrá sign-extension en el resultado int , porque el bit 0x8000 se establece en la máscara, que es el bit de signo.

cuando hacemos la manipulación de bits en los cortos, se cambian a int para evitar el desbordamiento,

No. No es posible un desbordamiento, así que esa no puede ser la razón. El motivo es la coherencia con otras operaciones que pueden desbordarse, es decir, +, -, *, /.