¿Por qué usar hex?

¡Oye! Estaba viendo este código en http://www.gnu.org/software/m68hc11/examples/primes_8c-source.html

Noté que en algunas situaciones usaban números hexadecimales, como en la línea 134:

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

Ahora, ¿por qué usarían 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 tienen esto:

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

El hex a 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 donde solo hay números hexadecimales y nunca entendí por qué 🙁

En ambos casos, 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, luego 2, 4, 8, 16, 32, 64 y finalmente 128 a medida que el ciclo progresa.

En binario, es decir,

0000:0001 , 0000:0010 , 0000:0100 , 0000:1000 , 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 hexadecimal: 0x01 , 0x02 , 0x04 , 0x08 , 0x10 , 0x20 , 0x40 y 0x80 .

En el segundo ejemplo, el objective era eliminar los dos bytes inferiores del valor. Entonces, dado 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 .

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”, entonces comienza con “00000001” y continúa moviendo ese bit hacia la izquierda “0000010”, “0000100”, etc. hasta “1000000”

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.

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.

Encuentro enloquecedor que la familia C de idiomas siempre haya soportado octal y hexadecimal pero no binario. Hace tiempo que deseaba que agregaran soporte directo para binario:

 int mask = 0b00001111; 

Hace muchos años / trabajos, mientras trabajaba en un proyecto que involucraba una enorme cantidad de matemáticas a nivel de bit, me cansé y genere un archivo de encabezado que contenía constantes definidas para todos los valores binarios posibles 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) 

A veces ha hecho que cierto código de nivel de bit sea más legible.

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, por lo 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 obvia es la representación binaria:

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

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

Espero que eso ayude.

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 usar números hexadecimales, porque es más fácil pasar de hexadecimal a binario que 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 

¿Puedes ver eso? Es mucho más simple pasar de hexadecimal a binario.

El mayor uso de hex es probablemente en la progtwigció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, muchas 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 hacer trampa, y dejan que el comstackdor genere los valores como parte de la optimización del tiempo de comstackció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... 

Para ser más precisos, hexadecimal y decimal, son todos 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 decimales. 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, (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 progtwigción; utilice la que mejor se adapte al dominio.

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.

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.

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

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