2011-06-30 29 views
18

Recientemente me encontré con una línea como esta¿Ventajas de utilizar 0x01 en lugar de 1 para una variable entera?

pública final static int DELETION_MASK = 0x01;

¿por qué no le gusta

pública final int DELETION_MASK estática = 1;

¿Hay alguna ventaja en utilizar el primer enfoque que no sea 0xA y los hexadecimales de límite superior se pueden convertir con facilidad? En este caso, es solo una constante que representa 1.

+0

Es una convención de lectura común para las máscaras, que parece ser que, ver http: // stackoverflow .com/questions/243712/why-use-hex (es C++ pero el mismo razonamiento) –

Respuesta

20

Si bien no hay una diferencia en el código producido por el compilador, las máscaras de bits se escriben tradicionalmente usando la notación hexadecimal, porque es mucho más fácil para un humano convertir a una forma binaria. Otra convención común es incluir los ceros a la izquierda cuando se conoce la longitud del campo. P.ej. para un campo C int, es común escribir:

#define MASK 0x0000ffff 

Además, las constantes hexadecimales indican al programador que es probablemente una máscara de bits, o un valor que será de alguna manera involucrado en operaciones bit a bit y debe, probablemente, ser tratado especialmente.

Como una ventaja, las notaciones hexadecimales también pueden evitar problemas con los números negativos: 0xffffffff es de hecho un número negativo (-1 para ser exactos). En lugar de hacer malabares con los números del signo y complemento de 2, puede especificar la máscara en hexadecimal y terminar con ella.


Desde Java 7 también se puede utilizar binary literals que hace que sea aún más fácil para un ser humano para comprender qué bits se encuentra en una máscara de bits. Y los literales binarios pueden hacer uso de underscores para poner los bits en grupos separados.

Eso significa que el siguiente también es válido:

public final static int DELETION_MASK = 0b0000_0001; 
+3

Supongo que la única ventaja es la legibilidad y nada relacionado con el rendimiento –

+0

Awesome. Gracias por explicar esto en detalle. –

+0

esta es una respuesta increíble, he estado buscando una explicación completa y este es un buen comienzo para mí. –

2

Solo eso, será consistente cuando defina NONDELETION_MASK = 0x0A.

+0

Gracias por la respuesta –

0

Es fácil de entender. Cada vez que pensamos en enmascarar, siempre pensamos en HEX o BIN.

+0

Gracias por la respuesta –

8

Ayuda con la conversión mental entre el valor entero y el patrón de bits que representa, que es lo que importa para banderas y máscaras.

Debido a que 16 es una potencia de 2 (a diferencia de 10), se obtiene buenas cosas que se repiten como esto:

public final static int A_FLAG = 0x01; // 00000001 
public final static int B_FLAG = 0x02; // 00000010 
public final static int C_FLAG = 0x04; // 00000100 
public final static int D_FLAG = 0x08; // 00001000 
public final static int E_FLAG = 0x10; // 00010000 
public final static int F_FLAG = 0x20; // 00100000 
public final static int G_FLAG = 0x40; // 01000000 
public final static int H_FLAG = 0x80; // 10000000 
+2

En C++ sólo tiene que utilizar (1 << 0) (1 << 1) (1 << 2) (1 << 3) hizo un poco más fácil en los ojos . – Chad

Cuestiones relacionadas