2008-10-28 25 views
54

¡Hola! Estaba buscando en este código en http://www.gnu.org/software/m68hc11/examples/primes_8c-source.html¿Por qué usar hex?

me di cuenta que en algunas situaciones se utilizan números hexadecimales, al igual que en la línea 134:

for (j = 1; val && j <= 0x80; j <<= 1, q++) 

Ahora ¿por qué habría que utilizar el 0x80? No soy tan bueno con el hexadecimal, pero encontré un hexágono en línea a decimal y me dio 128 de 0x80.

También antes de la línea 134, en la línea 114 que tienen la siguiente:

small_n = (n & 0xffff0000) == 0; 

El hexagonal para decimal me dio 4294901760 para ese número hexadecimal. ¿Entonces aquí en esta línea están haciendo un poco AND y comparando el resultado con 0?

¿Por qué no usar el número? ¿Puede alguien explicar y dar ejemplos de otras situaciones?

También he visto grandes líneas de código en las que es sólo números hexagonales y en realidad nunca entendió por qué :(

Respuesta

103

En ambos casos usted cita, el patrón de bits del número es importante, no el número real.

Por ejemplo, En el primer caso, j va a ser 1, a continuación, 2, 4, 8, 16, 32, 64 y finalmente 128 como el bucle progresa.

en binario, es decir,

0000:0001, 0000:0010, 0000:0100, , 0001:0000, 0010:0000, 0100:0000 y 1000:0000.

No hay opción para las constantes binarias en C o C++, pero es un poco más claro en Hex: 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40 y 0x80.

En el segundo ejemplo, , el objetivo era eliminar los dos bytes inferiores del valor. Por un valor de 1,234,567,890, queremos terminar con 1,234,567,168.
En hexadecimal, es más claro: comience con 0x4996:02d2, finalice con 0x4996:0000.

+2

Corrección secundaria en el segundo ejemplo: elimina los dos bytes inferiores de un número de cuatro bytes. La eliminación de los cuatro bytes inferiores sería simplemente "small_n = 0;". –

+3

D'Oh! Ya sabes, estaba debatiendo entre escribir "4 dígitos" y "dos bytes", así que, naturalmente, los fusioné en una declaración incorrecta ... –

17

es un poco máscara. Los valores hexadecimales facilitan ver la representación binaria subyacente. n & 0xffff0000 devuelve los 16 bits superiores de n. 0xffff0000 significa "16 1s y 16 0s en binario"

0x80 significa "1000000", por lo que comienza con "00000001" y continúa moviendo ese bit hacia la izquierda "0000010", "0000100", etc. hasta "1000000"

3

Los números hexadecimales o hexadecimales representan 4 bits de datos, 0 a 15 o HEX 0 a F. Dos valores hexadecimales representan un byte.

16

0xffff0000 es fácil de entender que es 16 veces "1" y 16 veces "0" en un valor de 32 bits, mientras que 4294901760 es mágico.

6

En ocasiones, la representación visual de valores en HEX hace que el código sea más legible o comprensible. Por ejemplo, el enmascaramiento de bits o el uso de bits no se vuelve obvio cuando se observan representaciones decimales de números.

Esto a veces puede hacer con la cantidad de espacio que un tipo de valor particular tiene para ofrecer, por lo que también puede desempeñar un papel.

Un ejemplo típico podría ser una configuración binaria, así que en lugar de usar valores decimales para mostrar algunos valores, usamos binarios.

digamos que un objeto tenía un conjunto no exclusivo de propiedades que tenían valores de activado o desactivado (3 de ellos); una forma de representar el estado de esas propiedades es con 3 bits.

las representaciones válidas son de 0 a 7 en decimal, pero eso no es tan obvio. más evidente es la representación binaria:

000, 001, 010, 011, 100, 101, 110, 111

También, algunas personas son muy cómodos con hexagonal. Tenga en cuenta también que los números mágicos codificados son solo eso y no es tan importante que no importa el sistema de numeración para usar

Espero que eso ayude.

1

Mirando el archivo, ese es un código bastante groady. Espero que seas bueno en C y no lo uses como un tutorial ...

Hex es útil cuando trabajas directamente en el nivel de bits o justo encima. Por ejemplo, trabajando en un controlador en el que se observan directamente los bits que ingresan desde un dispositivo y se entremezclan los resultados para que otra persona pueda leer un resultado coherente. Es una representación compacta de binario bastante fácil de leer.

+1

No hay nada de malo en ese código. Al mirar ese código, no pude encontrar una manera más clara de escribirlo sin usar HEX. – Kibbee

17

Hay un mapeo directo entre los dígitos hexadecimales (u octal para el caso) y los patrones de bits subyacentes, que no es el caso con el decimal. Un "9" decimal representa algo diferente con respecto a los patrones de bits, dependiendo de en qué columna se encuentre y qué números lo rodean, no tiene una relación directa con un patrón de bits. En hex, un '9' siempre significa '1001', sin importar en qué columna. 9 = '1001', 95 = '* 1001 * 0101' y así sucesivamente.

Como vestigio de mis días de 8 bits, encuentro que el hexadecimal es una abreviatura conveniente para cualquier cosa binaria. Bit twiddling es una habilidad agonizante. Una vez (hace unos 10 años) vi un tercer año de trabajo de redes en la universidad, donde solo el 10% (5 de 50) de las personas de la clase podía calcular una máscara de bits.

6

En general, el uso de números hexadecimales en lugar de decimales se debe a que la computadora funciona con bits (números binarios) y cuando se trabaja con bits también es más comprensible utilizar números hexadecimales, porque es más fácil pasar de hexadecimal a binario de Decimal a binario.

OxFF = 1111 1111 (F = 1111) 

pero

255 = 1111 1111 

porque

255/2 = 127 (rest 1) 
127/2 = 63 (rest 1) 
63/2 = 31 (rest 1) 
... etc 

Se puede ver que? Es mucho más simple pasar de hexadecimal a binario.

10

Encuentro enloquecedor que la familia C de idiomas siempre haya soportado octal y hexadecimal pero no binario.He deseado mucho que añadirían apoyo directo a binario: hace

int mask = 0b00001111; 

muchos años/puestos de trabajo, mientras se trabaja en un proyecto que ha supuesto una enorme cantidad de matemáticas a nivel de bit, me harté y ha generado una cabecera archivo que contenía define constantes para todos los posibles valores binarios de hasta 8 bits:

#define b0  (0x00) 
#define b1  (0x01) 
#define b00  (0x00) 
#define b01  (0x01) 
#define b10  (0x02) 
#define b11  (0x03) 
#define b000  (0x00) 
#define b001  (0x01) 
... 
#define b11111110 (0xFE) 
#define b11111111 (0xFF) 

se ha hecho en ocasiones cierto código a nivel de bit más legible.

+3

Re: "Hace tiempo que deseaba que agreguen soporte directo para binario" - algunos compiladores implementan esto como una extensión: lo he visto en varios compiladores PIC C, generalmente algo así como "0b10110110" –

+1

@Andrew Medico tienes su deseo con C++ 14 en exactamente la forma que usted mencionó. –

6

El mayor uso de hex es probablemente en la programación integrada. Los números hexadecimales se usan para enmascarar bits individuales en registros de hardware o dividir múltiples valores numéricos empaquetados en un único registro de 8, 16 o 32 bits.

Al especificar máscaras de bits individuales, una gran cantidad de personas comienzan por:

#define bit_0 1 
#define bit_1 2 
#define bit_2 4 
#define bit_3 8 
#define bit_4 16 
etc... 

Después de un tiempo, avanzan a:

#define bit_0 0x01 
#define bit_1 0x02 
#define bit_2 0x04 
#define bit_3 0x08 
#define bit_4 0x10 
etc... 

Luego aprenden a engañar, y dejar que el compilador generar los valores como parte de la optimización de tiempo de compilación:

#define bit_0 (1<<0) 
#define bit_1 (1<<1) 
#define bit_2 (1<<2) 
#define bit_3 (1<<3) 
#define bit_4 (1<<4) 
etc... 
3

Para ser más precisos, hexadecimales y decimales, ar e todos los NÚMEROS. La raíz (base 10, 16, etc.) son maneras de presentar esos números de una manera que es más clara o más conveniente.

Cuando hablamos de "cuántos de algo hay" normalmente usamos el decimal. Cuando buscamos direcciones o patrones de bits en las computadoras, generalmente se prefiere el hexadecimal, porque a menudo el significado de bytes individuales puede ser importante.

Hexágono (y octal) tienen la propiedad de que son potencias de dos, por lo que mapean agrupaciones de bits muy bien. Hex asigna 4 bits a un nibble hexadecimal (0-F), por lo que un byte se almacena en dos nibbles (00-FF). Octal era popular en Digital Equipment (DEC) y otras máquinas más antiguas, pero un dígito octal se mapea en tres bits, por lo que no cruza los límites de bytes tan bien.

En general, la elección de radix es una forma de facilitar su programación; utilice la que mejor se adapte al dominio.

3

Hay 8 bits en un byte. Hex, base 16, es escueto. Cualquier valor de byte posible se expresa usando dos caracteres de la colección 0..9, más a, b, c, d, e, f.

La base 256 sería más concisa. Cada byte posible podría tener su propio carácter, pero la mayoría de los lenguajes humanos no usan 256 caracteres, por lo que Hex es el ganador.

Para comprender la importancia de ser conciso, considere que en la década de 1970, cuando quería examinar su megabyte de memoria, se imprimía en hexadecimal. La impresión usaría varios miles de páginas de papel grande. Octal habría desperdiciado aún más árboles.