Hexadecimal - Hexadecimal

En matemáticas y computación , el sistema numérico hexadecimal (también base 16 o hexadecimal ) es un sistema numérico posicional que representa números usando una base (base) de 16. A diferencia de la forma común de representar números usando 10 símbolos, el hexadecimal usa 16 símbolos distintos, la mayoría de las veces los símbolos "0" - "9" para representar los valores de 0 a 9, y "A" - "F" (o alternativamente "a" - "f") para representar los valores de 10 a 15.

Los diseñadores y programadores de sistemas informáticos utilizan ampliamente los números hexadecimales porque proporcionan una representación amigable para los humanos de valores codificados en binario . Cada dígito hexadecimal representa cuatro bits (dígitos binarios), también conocido como nibble (o nybble), que es 1/2 de un byte . Por ejemplo, un solo byte puede tener valores que van desde 00000000 a 11111111 en forma binaria, que se pueden representar convenientemente como 00 a FF en hexadecimal.

En matemáticas, se suele utilizar un subíndice para especificar la base. Por ejemplo, el valor decimal1.281 se expresaría en hexadecimal como 501 16 . En programación, se utilizan una serie de notaciones para denotar números hexadecimales, que suelen incluir un prefijo o un sufijo. El prefijo 0xse usa en C y lenguajes de programación relacionados, lo que denotaría este valor como 0x501.

El hexadecimal se utiliza en la codificación de transferencia Base16 , en la que cada byte del texto sin formato se divide en dos valores de 4 bits y se representa mediante dos dígitos hexadecimales.

Representación

Representación escrita

En casi todos los usos modernos, las letras A – F o a – f representan los valores 10–15, mientras que los números 0–9 se utilizan para representar sus valores habituales.

No existe una convención universal para usar minúsculas o mayúsculas, por lo que cada uno es prevalente o preferido en entornos particulares según los estándares o la convención de la comunidad; incluso se utiliza a menudo el caso mixto. Las pantallas de siete segmentos utilizan AbCdEF de mayúsculas y minúsculas para generar dígitos que se puedan distinguir entre sí.

Existe cierta estandarización del uso de espacios (en lugar de comas u otro signo de puntuación) para separar valores hexadecimales en una lista larga. Por ejemplo, en el siguiente volcado hexadecimal, cada byte de 8 bits es un número hexadecimal de 2 dígitos, con espacios entre ellos, mientras que el desplazamiento de 32 bits al principio es un número hexadecimal de 8 dígitos.

00000000  57 69 6b 69 70 65 64 69  61 2c 20 74 68 65 20 66  
00000010  72 65 65 20 65 6e 63 79  63 6c 6f 70 65 64 69 61  
00000020  20 74 68 61 74 20 61 6e  79 6f 6e 65 20 63 61 6e 
00000030  20 65 64 69 74 0a

Distinguir del decimal

En contextos donde la base no es clara, los números hexadecimales pueden ser ambiguos y confundirse con números expresados ​​en otras bases. Existen varias convenciones para expresar valores sin ambigüedades. Un subíndice numérico (escrito a su vez en decimal) puede dar la base explícitamente: 159 10 es el decimal 159; 159 16 es hexadecimal 159, que es igual a 345 10 . Algunos autores prefieren un subíndice de texto, como 159 decimal y 159 hexadecimal , o 159 dy 159 h .

Donald Knuth introdujo el uso de un tipo de letra en particular para representar una raíz particular en su libro The TeXbook . Las representaciones hexadecimales están escritas allí en una tipografía de máquina de escribir : 5A3

En los sistemas de texto lineal, como los que se utilizan en la mayoría de los entornos de programación de computadoras, han surgido una variedad de métodos:

  • Los shells Unix (y relacionados), el lenguaje ensamblador de AT&T y también el lenguaje de programación C (y sus descendientes sintácticos como C ++ , C # , Go , D , Java , JavaScript , Python y Windows PowerShell ) usan el prefijo 0xpara las constantes numéricas representadas en hexadecimal: 0x5A3. Las constantes de caracteres y cadenas pueden expresar códigos de caracteres en hexadecimal con el prefijo \xseguido de dos dígitos hexadecimales: '\x1B'representa el carácter de control Esc ; "\x1B[0m\x1B[25;1H"es una cadena que contiene 11 caracteres con dos caracteres Esc incrustados. Para generar un entero como hexadecimal con la familia de funciones printf , se utiliza el código de conversión de formato %Xo %x.
  • En los URI (incluidas las URL ), los códigos de caracteres se escriben como pares hexadecimales con el prefijo %: http://www.example.com/name%20with%20spacesdonde %20es el código para el carácter de espacio (en blanco) , el punto del código ASCII 20 en hexadecimal, 32 en decimal.
  • En XML y XHTML , los caracteres se pueden expresar como referencias de caracteres numéricos hexadecimales utilizando la notación , por ejemplo, representa el carácter U + 2019 (la comilla simple derecha). Si no hay, el número es decimal (por lo tanto, es el mismo carácter).&#xcode;’x’
  • En el estándar Unicode , un valor de carácter se representa U+seguido por el valor hexadecimal, por ejemplo, U+20ACes el signo de euro (€).
  • Las referencias de color en HTML, CSS y X Window se pueden expresar con seis dígitos hexadecimales (dos cada uno para los componentes rojo, verde y azul, en ese orden) con el prefijo #: blanco, por ejemplo, se representa como #FFFFFF. CSS también permite abreviaturas de 3 dígitos hexadecimales con un dígito hexadecimal por componente: # FA3 abrevia # FFAA33 (una naranja dorada:  ).
  • En la codificación MIME (extensiones de correo electrónico) entre comillas e imprimibles , los códigos de caracteres se escriben como pares hexadecimales con el prefijo =: Espa=F1aes "España" (F1 es el código para ñ en el conjunto de caracteres ISO / IEC 8859-1).)
  • En los lenguajes ensambladores derivados de Intel y Modula-2, el hexadecimal se indica con un sufijo H o h : FFho 05A3H. Algunas implementaciones requieren un cero a la izquierda cuando el primer carácter de dígito hexadecimal no es un dígito decimal, por lo que se escribiría en 0FFhlugar de FFh. Algunas otras implementaciones (como NASM) permiten números de estilo C ( 0x42).
  • Otros lenguajes ensambladores ( 6502 , Motorola ), Pascal , Delphi , algunas versiones de BASIC ( Commodore ), GameMaker Idioma , Godot y Forth utilizar $como prefijo: $5A3.
  • Algunos lenguajes ensambladores (Microchip) usan la notación H'ABCD'(para ABCD 16 ). De manera similar, Fortran 95 usa Z'ABCD '.
  • Ada y VHDL encierran los números hexadecimales en base "comillas numéricos": 16#5A3#. Para las constantes de vector de bits, VHDL usa la notación x"5A3".
  • Verilog representa constantes hexadecimales en el formulario 8'hFF, donde 8 es el número de bits en el valor y FF es la constante hexadecimal.
  • El lenguaje Smalltalk usa el prefijo 16r:16r5A3
  • PostScript y el shell Bourne y sus derivados significan hex con prefijo 16#: 16#5A3. Para PostScript, los datos binarios (como los píxeles de la imagen ) se pueden expresar como pares hexadecimales consecutivos sin prefijo: AA213FD51B3801043FBC...
  • Common Lisp usa los prefijos #xy #16r. La configuración de las variables * read-base * y * print-base * en 16 también se puede utilizar para cambiar el lector y la impresora de un sistema Common Lisp a representación numérica hexadecimal para leer e imprimir números. Por lo tanto, los números hexadecimales se pueden representar sin el código de prefijo #x o # 16r, cuando la base de entrada o salida se ha cambiado a 16.
  • MSX BASIC , QuickBASIC , FreeBASIC y Visual Basic prefijan números hexadecimales con &H:&H5A3
  • BBC BASIC y Locomotora BASIC uso &para hex.
  • Las series TI-89 y 92 usan un 0hprefijo:0h5A3
  • ALGOL 68 utiliza el prefijo 16ra los números hexadecimales Significan: 16r5a3. Los números binarios, cuaternarios (base 4) y octales se pueden especificar de manera similar.
  • El formato más común para hexadecimal en mainframes IBM ( zSeries ) y computadoras de rango medio ( IBM i ) que ejecutan el sistema operativo tradicional ( zOS , zVSE , zVM , TPF , IBM i ) es X'5A3'y se usa en Assembler, PL / I , COBOL , JCL , scripts, comandos y otros lugares. Este formato también era común en otros sistemas IBM (y ahora obsoletos). De vez en cuando se usaban comillas en lugar de apóstrofos.
  • Cualquier dirección IPv6 se puede escribir como ocho grupos de cuatro dígitos hexadecimales (a veces llamados hextetos ), donde cada grupo está separado por dos puntos ( :). Esta, por ejemplo, es una dirección IPv6 válida: 2001:0db8:85a3:0000:0000:8a2e:0370:7334o abreviada eliminando ceros como 2001:db8:85a3::8a2e:370:7334(las direcciones IPv4 generalmente se escriben en decimal).
  • Los identificadores únicos globales se escriben como treinta y dos dígitos hexadecimales, a menudo en agrupaciones desiguales separadas por guiones, por ejemplo 3F2504E0-4F89-41D3-9A0C-0305E82C3301.

Otros símbolos para 10-15

El uso de las letras de la A a la F para representar los dígitos por encima de 9 no era universal en la historia temprana de las computadoras.

  • Durante la década de 1950, algunas instalaciones, como Bendix-14, favorecieron el uso de los dígitos del 0 al 5 con una línea superior para denotar los valores 10-15 como 0 , 1 , 2 , 3 , 4 y 5 .
  • Las computadoras SWAC (1950) y Bendix G-15 (1956) utilizaron las letras minúsculas u , v , w , x , y y z para los valores de 10 a 15.
  • La computadora ILLIAC I (1952) usó las letras mayúsculas K , S , N , J , F y L para los valores de 10 a 15.
  • El Librascope LGP-30 (1956) utilizó las letras F , G , J , K , Q y W para los valores de 10 a 15.
  • El Honeywell Datamatic D-1000 (1957) usó las letras minúsculas b , c , d , e , f y g mientras que el Elbit  100 (1967) usó las letras mayúsculas B , C , D , E , F y G para los valores 10 a 15.
  • El Monrobot XI (1960) utilizó las letras S , T , U , V , W y X para los valores de 10 a 15.
  • La computadora parametrón NEC NEAC 1103 (1960) usó las letras D , G , H , J , K (y posiblemente V ) para los valores 10-15.
  • El Pacific Data Systems 1020 (1964) utilizó las letras L , C , A , S , M y D para los valores de 10 a 15.
  • Boby Lapointe introdujo nuevos símbolos numéricos y nombres en la notación Bibi-binaria en 1968. Esta notación no se hizo muy popular.
Propuesta de notación hexadecimal de Bruce Alan Martin
  • Bruce Alan Martin, del Laboratorio Nacional de Brookhaven, consideró la elección de A – F "ridícula". En una carta de 1968 al editor del CACM , propuso un conjunto de símbolos completamente nuevo basado en las ubicaciones de los bits, que no obtuvo mucha aceptación.
  • Algunos chips decodificadores de pantalla de siete segmentos (es decir, 74LS47) muestran una salida inesperada debido a una lógica diseñada solo para producir 0-9 correctamente.

Representaciones verbales y digitales

No hay números tradicionales para representar las cantidades de diez a quince (las letras se utilizan como sustituto) y la mayoría de los idiomas europeos carecen de nombres no decimales para los números superiores a diez. Aunque el inglés tiene nombres para varias potencias no decimales ( par para la primera potencia binaria , puntuación para la primera potencia vigesimal , docena , bruto y gran bruto para las tres primeras potencias duodecimales ), ningún nombre en inglés describe las potencias hexadecimales (decimal 16 , 256, 4096, 65536, ...). Algunas personas leen números hexadecimales dígito a dígito, como un número de teléfono, o usan el alfabeto fonético de la OTAN , el Alfabeto Fonético Conjunto Ejército / Armada o un sistema ad-hoc similar . A raíz de la adopción del hexadecimal entre los programadores de IBM System / 360 , Magnuson (1968) sugirió una guía de pronunciación que daba nombres cortos a las letras hexadecimales; por ejemplo, "A" se pronunciaba "ann", B "bet", C "chris", etc. Otro sistema de nomenclatura fue elaborado por Babb (2015), a partir de una serie de televisión a modo de broma. Otro sistema de nomenclatura fue publicado en línea por Rogers (2007) que intenta hacer que la representación verbal sea distinguible en cualquier caso, incluso cuando el número real no contiene números A – F. Los ejemplos se enumeran en las tablas siguientes.

Esquema de conteo de dedos hexadecimal

Se han ideado sistemas de conteo con dígitos tanto para binarios como para hexadecimales. Arthur C. Clarke sugirió usar cada dedo como un bit de encendido / apagado, lo que permite contar los dedos de cero a 1023 10 en diez dedos. Otro sistema para contar hasta FF 16 (255 10 ) se ilustra a la derecha.


Método de denominación de Magnusson (1968)
Número Pronunciación
A Ana
B apuesta
C chris
D punto
mi Ernesto
F escarcha
1A diecisiete
A0 annty
5B cincuenta apuesta
A01C annty christeen
1AD0 diecisiete loco
3A7D treinta y setenta puntos

Método de denominación de Rogers (2007)
Número Pronunciación
A diez
B once
C doce
D empapar
mi eptwin
F fim
10 Texas
11 oneteek
1F fimteek
50 Fiftek
C0 twelftek
100 hundrek
1000 thousek
3E trecek-eptwin
E1 eptek-uno
C4A doce-cien-catorce-diez
1743 uno-mil-siete
-cien-catorce-tres

Señales

El sistema hexadecimal puede expresar números negativos de la misma manera que en decimal: −2A para representar −42 10 y así sucesivamente.

El hexadecimal también se puede utilizar para expresar los patrones de bits exactos que se utilizan en el procesador , por lo que una secuencia de dígitos hexadecimales puede representar un valor con signo o incluso en coma flotante . De esta manera, el número negativo -42 10 se puede escribir como FFFF FFD6 en un registro de CPU de 32 bits (en complemento a dos ), como C228 0000 en un registro FPU de 32 bits o C045 0000 0000 0000 en un FPU de 64 bits register (en el estándar de coma flotante IEEE ).

Notación exponencial hexadecimal

Así como los números decimales se pueden representar en notación exponencial , también lo pueden hacer los números hexadecimales. Por convención, la letra P (o P , por "poder") representa veces dos elevado a la potencia de , mientras que E (o e ) sirve a un propósito similar en decimal como parte de la notación E . El número después de la P es decimal y representa el exponente binario . Incrementar el exponente por 1 multiplica por 2, no 16. 10.0p1 = 8.0p2 = 4.0p3 = 2.0p4 = 1.0p5. Por lo general, el número se normaliza de modo que el primer dígito hexadecimal sea 1 (a menos que el valor sea exactamente 0).

Ejemplo: 1.3DEp42 representa 1.3DE 16  × 2 42 10 .

La notación exponencial hexadecimal es requerida por el estándar de coma flotante binaria IEEE 754-2008 . Esta notación se puede utilizar para los literales de punto flotante en el C99 edición del lenguaje de programación C . Usando los especificadores de conversión % a o % A , esta notación se puede producir mediante implementaciones de la familia de funciones printf siguiendo la especificación C99 y el estándar POSIX de la Especificación Única de Unix (IEEE Std 1003.1) .

Conversión

Conversión binaria

La mayoría de las computadoras manipulan datos binarios, pero es difícil para los humanos trabajar con una gran cantidad de dígitos incluso para un número binario relativamente pequeño. Aunque la mayoría de los humanos están familiarizados con el sistema de base 10, es mucho más fácil mapear binario a hexadecimal que a decimal porque cada dígito hexadecimal mapea a un número entero de bits (4 10 ). Este ejemplo convierte 1111 2 en base diez. Dado que cada posición en un número binario puede contener un 1 o un 0, su valor puede determinarse fácilmente por su posición desde la derecha:

  • 0001 2 = 1 10
  • 0010 2 = 2 10
  • 0100 2 = 4 10
  • 1000 2 = 8 10

Por lo tanto:

1111 2 = 8 10 + 4 10 + 2 10 + 1 10
  = 15 10

Con poca práctica, el mapeo de 1111 2 a F 16 en un solo paso se vuelve fácil: vea la tabla en representación escrita . La ventaja de usar hexadecimal en lugar de decimal aumenta rápidamente con el tamaño del número. Cuando el número aumenta, la conversión a decimal es muy tediosa. Sin embargo, cuando se asigna a hexadecimal, es trivial considerar la cadena binaria como grupos de 4 dígitos y asignar cada uno a un solo dígito hexadecimal.

Este ejemplo muestra la conversión de un número binario a decimal, mapeando cada dígito al valor decimal y sumando los resultados.

(01011110101101010010) 2 = 262144 10 + 65536 10 + 32768 10 + 16384 10 + 8192 10 + 2048 10 + 512 10 + 256 10 + 64 10 + 16 10 + 2 10
  = 387922 10

Compare esto con la conversión a hexadecimal, donde cada grupo de cuatro dígitos se puede considerar de forma independiente y convertir directamente:

(01011110101101010010) 2 = 0101  1110  1011  0101  0010 2
  = 5 mi B 5 2 16
  = 5EB52 16

La conversión de hexadecimal a binario es igualmente directa.

Otras conversiones simples

Aunque el cuaternario (base 4) se usa poco, se puede convertir fácilmente hacia y desde hexadecimal o binario. Cada dígito hexadecimal corresponde a un par de dígitos cuaternarios y cada dígito cuaternario corresponde a un par de dígitos binarios. En el ejemplo anterior 5 E B 5 2 16 = 11 32 23 11 02 4 .

El sistema octal (base 8) también se puede convertir con relativa facilidad, aunque no tan trivialmente como con las bases 2 y 4. Cada dígito octal corresponde a tres dígitos binarios, en lugar de cuatro. Por lo tanto, podemos convertir entre octal y hexadecimal a través de una conversión intermedia a binaria seguida de reagrupar los dígitos binarios en grupos de tres o cuatro.

Resto de la división en la base de origen

Al igual que con todas las bases, existe un algoritmo simple para convertir una representación de un número en hexadecimal haciendo operaciones de división de enteros y resto en la base de origen. En teoría, esto es posible desde cualquier base, pero para la mayoría de los seres humanos solo el decimal y para la mayoría de las computadoras solo el binario (que se puede convertir mediante métodos mucho más eficientes) se puede manejar fácilmente con este método.

Sea d el número a representar en hexadecimal, y la serie h i h i − 1 ... h 2 h 1 sean los dígitos hexadecimales que representan el número.

  1. yo ← 1
  2. h i ← d mod 16
  3. d ← (d - h i ) / 16
  4. Si d = 0 (devuelve la serie h i ) de lo contrario, incremente i y vaya al paso 2

"16" se puede reemplazar con cualquier otra base que se desee.

La siguiente es una implementación de JavaScript del algoritmo anterior para convertir cualquier número a hexadecimal en la representación de cadena. Su propósito es ilustrar el algoritmo anterior. Sin embargo, para trabajar con datos en serio, es mucho más recomendable trabajar con operadores bit a bit .

function toHex(d) {
  var r = d % 16;
  if (d - r == 0) {
    return toChar(r);
  }
  return toHex((d - r) / 16) + toChar(r);
}

function toChar(n) {
  const alpha = "0123456789ABCDEF";
  return alpha.charAt(n);
}

Conversión mediante suma y multiplicación

Una tabla de multiplicar hexadecimal

También es posible realizar la conversión asignando a cada lugar en la base fuente la representación hexadecimal de su valor posicional, antes de realizar la multiplicación y la suma para obtener la representación final. Por ejemplo, para convertir el número B3AD a decimal, uno puede dividir el número hexadecimal en sus dígitos: B (11 10 ), 3 (3 10 ), A (10 10 ) y D (13 10 ), y luego obtener el resultado final. El resultado es multiplicar cada representación decimal por 16 p ( siendo p la posición del dígito hexadecimal correspondiente, contando de derecha a izquierda, comenzando con 0). En este caso, tenemos que:

B3AD = (11 × 16 3 ) + (3 × 16 2 ) + (10 × 16 1 ) + (13 × 16 0 )

que es 45997 en base 10.

Herramientas para la conversión

La mayoría de los sistemas informáticos modernos con interfaces gráficas de usuario proporcionan una utilidad de calculadora incorporada capaz de realizar conversiones entre los distintos radicales y, en la mayoría de los casos, también incluirían el hexadecimal.

En Microsoft Windows , la utilidad Calculadora se puede configurar en modo Científico (llamado modo Programador en algunas versiones), que permite conversiones entre la base 16 (hexadecimal), 10 (decimal), 8 ( octal ) y 2 ( binario ), las bases más comúnmente utilizado por los programadores. En el modo científico, el teclado numérico en pantalla incluye los dígitos hexadecimales de la A a la F, que están activos cuando se selecciona "Hex". Sin embargo, en modo hexadecimal, la Calculadora de Windows solo admite números enteros.

Aritmética elemental

Las operaciones elementales tales como suma, resta, multiplicación y división se pueden realizar indirectamente mediante la conversión a un sistema numérico alternativo , como el sistema decimal comúnmente utilizado o el sistema binario donde cada dígito hexadecimal corresponde a cuatro dígitos binarios.

Alternativamente, también se pueden realizar operaciones elementales directamente dentro del propio sistema hexadecimal, confiando en sus tablas de suma / multiplicación y sus correspondientes algoritmos estándar, como la división larga y el algoritmo de resta tradicional.

Numeros reales

Numeros racionales

Al igual que con otros sistemas numéricos, el sistema hexadecimal puede usarse para representar números racionales , aunque las expansiones repetidas son comunes ya que dieciséis (10 16 ) tiene un solo factor primo; dos.

Para cualquier base, 0,1 (o "1/10") siempre equivale a uno dividido por la representación de ese valor base en su propio sistema numérico. Por lo tanto, ya sea dividiendo uno por dos para binario o dividiendo uno por dieciséis para hexadecimal, ambas fracciones se escriben como 0.1. Debido a que la base 16 es un cuadrado perfecto (4 2 ), las fracciones expresadas en hexadecimal tienen un período impar con mucha más frecuencia que las decimales, y no hay números cíclicos (excepto los triviales de un solo dígito). Los dígitos recurrentes se exhiben cuando el denominador en términos más bajos tiene un factor primo que no se encuentra en la base; por lo tanto, cuando se usa la notación hexadecimal, todas las fracciones con denominadores que no son una potencia de dos dan como resultado una cadena infinita de dígitos recurrentes (como tercios y quintos). Esto hace que el hexadecimal (y el binario) sea menos conveniente que el decimal para representar números racionales, ya que una proporción mayor se encuentra fuera de su rango de representación finita.

Todos los números racionales finitamente representables en hexadecimal también son finitamente representables en decimal, duodecimal y sexagesimal : es decir, cualquier número hexadecimal con un número finito de dígitos también tiene un número finito de dígitos cuando se expresa en esas otras bases. Por el contrario, sólo una fracción de los finitamente representables en las últimas bases son finitamente representables en hexadecimal. Por ejemplo, el decimal 0.1 corresponde a la representación repetida infinita 0.1 9 en hexadecimal. Sin embargo, hexadecimal es más eficiente que duodecimal y sexagesimal para representar fracciones con potencias de dos en el denominador. Por ejemplo, 0.0625 10 (un dieciseisavo) es equivalente a 0.1 16 , 0.09 12 y 0; 3,45 60 .

norte
Factores primos decimales de base, b = 10: 2 , 5 ; b - 1 = 9: 3 ; b + 1 = 11:11

Factores primos hexadecimales de base, b = 16 10 = 10: 2 ; b - 1 = 15 10 = F: 3, 5 ; b + 1 = 17 10 = 11:11
Fracción Factores primos Representación posicional Representación posicional Factores primos Fracción (1 / n)
2 1/2 2 0,5 0,8 2 1/2
3 1/3 3 0. 3333 ... = 0. 3 0. 5555 ... = 0. 5 3 1/3
4 1/4 2 0,25 0.4 2 1/4
5 1/5 5 0,2 0. 3 5 1/5
6 1/6 2 , 3 0,1 6 0,2 A 2 , 3 1/6
7 1/7 7 0. 142857 0. 249 7 1/7
8 1/8 2 0,125 0,2 2 1/8
9 1/9 3 0, 1 0. 1C7 3 1/9
10 1/10 2 , 5 0,1 0,1 9 2 , 5 1 / A
11 1/11 11 0. 09 0. 1745D B 1 / B
12 1/12 2 , 3 0,08 3 0,1 5 2 , 3 1 / C
13 1/13 13 0. 076923 0. 13B D 1 / D
14 14/1 2 , 7 0,0 714285 0,1 249 2 , 7 1 / E
15 15/1 3 , 5 0,0 6 0, 1 3 , 5 1 / F
dieciséis 1/16 2 0.0625 0,1 2 1/10
17 17/1 17 0. 0588235294117647 0. 0F 11 1/11
18 18/1 2 , 3 0,0 5 0.0 E38 2 , 3 1/12
19 19/1 19 0. 052631578947368421 0. 0D79435E5 13 1/13
20 1/20 2 , 5 0,05 0,0 C 2 , 5 14/1
21 1/21 3 , 7 0. 047619 0. 0C3 3 , 7 15/1
22 1/22 2 , 11 0,0 45 0.0 BA2E8 2 , B 1/16
23 1/23 23 0. 0434782608695652173913 0. 0B21642C859 17 17/1
24 24/1 2 , 3 0,041 6 0,0 A 2 , 3 18/1
25 1/25 5 0,04 0. 0A3D7 5 19/1
26 26/1 2 , 13 0,0 384615 0.0 9D8 2 , D 1 / 1A
27 1/27 3 0. 037 0. 097B425ED 3 1 / 1B
28 1/28 2 , 7 0,03 571428 0,0 924 2 , 7 1 / 1C
29 1/29 29 0. 0344827586206896551724137931 0. 08D3DCB 1D 1 / 1D
30 30/1 2 , 3 , 5 0,0 3 0,0 8 2 , 3 , 5 1 / 1E
31 1/31 31 0. 032258064516129 0. 08421 1F 1 / 1F
32 1/32 2 0.03125 0,08 2 1/20
33 1/33 3 , 11 0. 03 0. 07C1F 3 , B 1/21
34 1/34 2 , 17 0,0 2941176470588235 0,0 78 2 , 11 1/22
35 1/35 5 , 7 0,0 285714 0. 075 5 , 7 1/23
36 1/36 2 , 3 0,02 7 0.0 71C 2 , 3 24/1

Numeros irracionales

La siguiente tabla muestra las expansiones de algunos números irracionales comunes en decimal y hexadecimal.

Número Representación posicional
Decimal Hexadecimal
2 (la longitud de la diagonal de un cuadrado unitario ) 1.414 213 562 373 095 048 ... 1.6A09E667F3BCD ...
3 (la longitud de la diagonal de un cubo unitario ) 1.732 050 807 568 877 293 ... 1.BB67AE8584CAA ...
5 (la longitud de la diagonal de un rectángulo de 1 × 2 ) 2.236 067 977 499 789 696 ... 2.3C6EF372FE95 ...
φ (phi, la proporción áurea = (1+ 5 ) / 2 ) 1,618 033 988 749 894 848 ... 1.9E3779B97F4A ...
π (pi, la relación entre la circunferencia y el diámetro de un círculo) 3.141 592 653 589 793 238 462 643
383 279 502 884 197 169 399 375 105 ...
3.243F6A8885A308D313198A2E0
3707344A4093822299F31D008 ...
e (la base del logaritmo natural ) 2.718 281 828 459 045 235 ... 2.B7E151628AED2A6B ...
τ (la constante de Thue-Morse ) 0,412 454 033 640 107 597 ... 0,6996 9669 9669 6996 ...
γ (la diferencia límite entre la
serie armónica y el logaritmo natural)
0,577 215 664 901 532 860 ... 0.93C467E37DB0C7A4D1B ...

Potestades

Las potencias de dos tienen expansiones muy simples en hexadecimal. Las primeras dieciséis potencias de dos se muestran a continuación.

2 x Valor Valor (decimal)
2 0 1 1
2 1 2 2
2 2 4 4
2 3 8 8
2 4 10 hexadecimales 16 dic
2 5 20 hexadecimales 32 dic
2 6 40 hexadecimales 64 dic
2 7 80 hexadecimales 128 dic
2 8 100 hexadecimales 256 dic
2 9 200 hexadecimales 512 dic
2 A (2 10 dec. ) 400 hexadecimales 1024 dic
2 B (2 11 dic ) 800 hex 2048 dic
2 C (2 12 dic ) 1000 hexadecimales 4096 dic
2 D (2 13 dic ) 2000 hexadecimales 8192 dic
2 E (2 14 dic ) 4000 hexadecimales 16,384 dic
2 F (2 15 dic ) 8000 hexadecimales 32,768 dic
2 10 (2 16 dic ) 10000 hexadecimal 65,536 dic

Historia cultural

Las unidades de medida tradicionales chinas eran base-16. Por ejemplo, un jīn (斤) en el sistema antiguo equivale a dieciséis taels . El suanpan ( ábaco chino ) se puede utilizar para realizar cálculos hexadecimales como sumas y restas.

Al igual que con el sistema duodecimal , ha habido intentos ocasionales de promover el hexadecimal como el sistema numérico preferido. Estos intentos a menudo proponen una pronunciación y símbolos específicos para los números individuales. Algunas propuestas unifican las medidas estándar para que sean múltiplos de 16. John W. Nystrom presentó una de sus primeras propuestas en el Proyecto de un nuevo sistema de aritmética, peso, medida y monedas: propuesto para llamarse Sistema Tonal, con dieciséis to the Base , publicado en 1862. Nystrom, entre otras cosas, sugirió el tiempo hexadecimal , que subdivide un día entre 16, de modo que hay 16 "horas" (o "10 tims ", pronunciado tontim ) en un día.

La palabra hexadecimal se registra por primera vez en 1952. Es macarrónico en el sentido de que combina griega ἕξ (hex) "seis" con Latinate -decimal . El sexadecimal alternativo totalmente latino (compare la palabra sexagesimal con base 60) es más antiguo y se usa al menos ocasionalmente desde finales del siglo XIX. Todavía se usa en la década de 1950 en la documentación de Bendix . Schwartzman (1994) sostiene que el uso de sexadecimal puede haberse evitado debido a su sugerente abreviatura de sexo . Muchos lenguajes occidentales desde la década de 1960 han adoptado términos equivalentes en la formación a hexadecimal (por ejemplo Francés hexadécimal , italiano esadecimale , rumano hexazecimal , Serbio хексадецимални , etc.), pero otros han introducido términos que sustituyen las palabras nativas para "dieciséis" (por ejemplo δεκαεξαδικός griego, islandés sextándakerfi , ruso шестнадцатеричной, etc.)

La terminología y la notación no se establecieron hasta finales de la década de 1960. Donald Knuth en 1969 argumentó que el término etimológicamente correcto sería senidenario , o posiblemente sedenario , un término latino destinado a expresar "agrupado por 16" modelado en binario , ternario y cuaternario, etc. Según el argumento de Knuth, los términos correctos para decimal y octal la aritmética sería denario y octonario , respectivamente. Alfred B. Taylor usó senidenary en su trabajo de mediados del siglo XIX sobre bases numéricas alternativas, aunque rechazó la base 16 debido a su "número incómodo de dígitos".

La notación actual que usa las letras de la A a la F se establece como el estándar de facto a partir de 1966, a raíz de la publicación del manual de Fortran IV para IBM System / 360 , que (a diferencia de las variantes anteriores de Fortran) reconoce un estándar para ingresar constantes hexadecimales. Como se señaló anteriormente, NEC (1960) y The Pacific Data Systems 1020 (1964) utilizaron notaciones alternativas . El estándar adoptado por IBM parece haber sido ampliamente adoptado en 1968, cuando Bruce Alan Martin en su carta al editor del CACM se queja de que

"Con la ridícula elección de las letras A, B, C, D, E, F como símbolos numéricos hexadecimales que se suman a los ya problemáticos problemas de distinguir números octales (o hexadecimales) de números decimales (o nombres de variables), el tiempo está exagerado para reconsiderar de nuestros símbolos numéricos. ¡Esto debería haberse hecho antes de que las malas elecciones se convirtieran en un estándar de facto! "

El argumento de Martin era que el uso de números del 0 al 9 en números no decimales "implica para nosotros un esquema de valor posicional de base diez": "¿Por qué no usar símbolos (y nombres) completamente nuevos para los siete o quince dígitos distintos de cero necesarios en octal o hexadecimal? . Incluso el uso de las letras de la A a la P sería una mejora, pero símbolos completamente nuevos podrían reflejar la naturaleza binaria del sistema ".


Base16 (codificación de transferencia)

Base16 (como nombre propio sin espacios) también puede referirse a una codificación binaria a texto que pertenece a la misma familia que Base32 , Base58 y Base64 .

En este caso, los datos se dividen en secuencias de 4 bits y cada valor (entre 0 y 15 inclusive) se codifica utilizando 16 símbolos del juego de caracteres ASCII . Aunque se pueden utilizar 16 símbolos del conjunto de caracteres ASCII, en la práctica siempre se eligen los dígitos ASCII '0' - '9' y las letras 'A' - 'F' (o las minúsculas 'a' - 'f') para alinearse con la notación escrita estándar para números hexadecimales.

Hay varias ventajas de la codificación Base16:

  • La mayoría de los lenguajes de programación ya tienen facilidades para analizar hexadecimal codificado en ASCII
  • Al ser exactamente medio byte, 4 bits es más fácil de procesar que los 5 o 6 bits de Base32 y Base64 respectivamente
  • Los símbolos 0-9 y AF son universales en notación hexadecimal, por lo que se entienden fácilmente de un vistazo sin necesidad de depender de una tabla de búsqueda de símbolos.
  • Muchas arquitecturas de CPU tienen instrucciones dedicadas que permiten el acceso a medio byte (también conocido como " nibble "), lo que lo hace más eficiente en hardware que Base32 y Base64

Las principales desventajas de la codificación Base16 son:

  • La eficiencia del espacio es solo del 50%, ya que cada valor de 4 bits de los datos originales se codificará como un byte de 8 bits. En contraste, las codificaciones Base32 y Base64 tienen una eficiencia espacial del 63% y 75% respectivamente.
  • Posible complejidad añadida de tener que aceptar letras mayúsculas y minúsculas

El soporte para la codificación Base16 es omnipresente en la informática moderna. Es la base del estándar W3C para la codificación de porcentaje de URL , donde un carácter se reemplaza con un signo de porcentaje "%" y su forma codificada en Base16. La mayoría de los lenguajes de programación modernos incluyen directamente soporte para formatear y analizar números codificados en Base16.

Ver también

Referencias