Pregunta

Hey! Estaba mirando 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 hex, pero encontré un hexágono en línea a decimal y me dio 128 para 0x80.

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

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

El hexadecimal al decimal me dio 4294901760 para ese número hexadecimal. Así que aquí, en esta línea, están haciendo un poco Y y comparando el resultado con 0?

¿Por qué no solo usar el número? ¿Alguien puede explicar y dar ejemplos de otras situaciones?

También he visto grandes líneas de código donde solo son números hexadecimales y nunca entendí realmente por qué :(

¿Fue útil?

Solución

En los dos casos que cites, 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 avanza el ciclo.

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 Hex: 0x01 , 0x02 , 0x04 , 0x08 , 0x10 , 0x20 , 0x40 , y 0x80 .

En el segundo ejemplo, el objetivo 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 , termine con 0x4996: 0000 .

Otros consejos

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

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

es una máscara de bits. Los valores hexadecimales facilitan ver la representación binaria subyacente. n & amp; 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úe desplazando ese bit hacia la izquierda " 0000010 " ;, " 0000100 " ;, etc hasta que " 1000000 "

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.

Me resulta enloquecedor que la familia de idiomas C siempre haya soportado octal y hex, pero no binario. Hace mucho tiempo que deseaba que agregaran soporte directo para binarios:

int mask = 0b00001111;

Hace muchos años / trabajos, mientras trabajaba en un proyecto que involucraba una gran cantidad de matemáticas a nivel de bits, me harté y generé 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)

Ocasionalmente ha hecho que algunos códigos de nivel de bits sean más legibles.

A veces, la representación visual de los 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 es obvio cuando se observan representaciones decimales de números.

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

Un ejemplo típico podría estar en una configuración binaria, por lo que en lugar de usar decimal para mostrar algunos valores, usamos binario.

digamos que un objeto tenía un conjunto no exclusivo de propiedades que tenían valores de encendido o apagado (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 hex. Tenga en cuenta también que los números mágicos codificados son solo eso y que no es tan importante, no importa el sistema de numeración que se utilice

Espero que 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 sencillo pasar de Hex a binario.

El mayor uso de hex es probablemente en la programación integrada. Los números hexadecimales se utilizan para enmascarar bits individuales en registros de hardware, o dividir múltiples valores numéricos empaquetados en un solo 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 compilador genere los valores como parte de la optimización del 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...

Hay 8 bits en un byte. Hex, base 16, es conciso. Cualquier valor de byte posible se expresa utilizando 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 único, 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 imprimió en hexadecimal. La impresión usaría varios miles de páginas de papel grande. Octal habría desperdiciado aún más árboles.

Para ser más precisos, hexadecimales y decimales, son todos NÚMEROS. El radix (base 10, 16, etc.) son formas de presentar esos números de una manera más clara o más conveniente.

Al discutir " cuántos de algo hay " Normalmente usamos decimal. Cuando estamos buscando direcciones o patrones de bits en las computadoras, generalmente se prefiere el hex, 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 fue popular en Digital Equipment (DEC) y otras máquinas más antiguas, pero un dígito octal se asigna a tres bits, por lo que no cruza los límites de los bytes tan bien.

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

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

Mirando el archivo, eso es un código bastante extenso. 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 por encima de él. Por ejemplo, trabajando en un controlador en el que está mirando directamente los bits que vienen de un dispositivo y manipula los resultados para que otra persona pueda leer un resultado coherente. Es una representación compacta de archivos binarios bastante fácil de leer.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top