Microhobby 26. Año II, del 30 de abril al 6 de mayo de 1985

Iniciación: Representación de los números en el Spectrum (II) Sistema Hexadecimal

José T. Crovetto

La notación hexadecimal es, probablemente, la más adecuada para relacionarse con un ordenador. Permite representar números más grandes con menos dígitos y, por otra parte, al incluir letras en sus expresiones, resulta más legible para el usuario.

Al leer su manual del Spectrum habrá encontrado que, al tratar sobre los números, emplea la base diez (sistema decimal que utilizamos habitualmente), la base dos (sistema binario del que hablamos en el primer artículo de esta serie) y la base dieciséis o notación hexadecimal.

La primera pregunta que nos podemos hacer es, ¿por qué la base dieciséis y no otra? Si la información en la memoria del Spectrum se guarda en sistema binario (bits), ¿qué utilidad tiene que nosotros empleemos otra base para representar a los mismos números? La contestación a estas preguntas requiere conocer la base dieciséis.

Veamos, en primer lugar, la representación de números enteros en notación hexadecimal.

Tabla 1

Decimal Binario Hexadecimal
0 0000 0
1 0001 1
2 0010 2
3 0011 3
4 0100 4
5 0101 5
6 0110 6
7 0111 7
8 1000 8
9 1001 9
10 1010 A
11 1011 B
12 1100 C
13 1101 D
14 1110 E
15 1111 F

Hemos escrito los números binarios de la tabla con cuatro bits. Realmente el cero y el uno se pueden representar con un bit, el dos y el tres con dos bits, y el cuatro, cinco, seis y siete con tres bits. Sin embargo, recordarlo así, se verá posteriormente que resulta útil.

Así pues, un número expresado en base dieciséis puede contener letras (A a F) en alguna de sus cifras, algo a lo que no estamos muy acostumbrados.

Vistos esto, el tratamiento de números expresados en base dieciséis es similar al de base dos o base diez que vimos en nuestro anterior artículo. Aplicando los mismos principios, tenemos que: Cualquier número en base dieciséis se representa por combinaciones de los dígitos o cifras hexadecimales, asignando un peso a cada uno de ellos según el lugar que ocupen.

El peso de cada uno de los dígitos hexadecimales que forman el número, es la potencia de dieciséis igual al lugar que ocupen, comenzando a contar desde cero y de derecha a izquierda. Por ejemplo:

En el número 734H, los pesos de los dígitos son, comenzando por el de la derecha, 160 (=1), 161 (=16) y 162 (=256), respectivamente, es decir que: 734H = 7 x 1622 + 3 x 161 + 4 x 160 = 7 x 256 + 3 x 16 + 4 = 1844D

Obsérvese como conociendo los pesos, la conversión hexadecimal a decimal es inmediata.

Veamos otro ejemplo:

¿Cual será el equivalente decimal del hexadecimal FE2AH ?

Si procedemos como en el ejemplo anterior, tendremos: FE2AH = F x 163 + E x 162 + 2xl61 + A x 160 = 15×4096+ 14×256 + 2×16 + 10 = 65066D en base diez.

Recuerde que el equivalente decimal del dígito hexadecimal F es 15D, el de E es 14D y el de A es 10D.

Es útil aprender de memoria las cuatro primeras potencias de dieciséis, que se corresponden con los pesos de los cuatro primeros dígitos (comenzando por la derecha) de cualquier número hexadecimal:

160 = 1; 161 = 16; 162 = 256; 163 = 4096

La operación inversa, es decir, dado un número en base diez calcular su equivalente en base dieciséis, se resuelve mediante un algoritmo, similar al visto en el anterior artículo para la conversión de base diez a base dos, denominado de divisiones sucesivas. El método consiste en dividir el número entre dieciséis y el cociente de esta división dividirlo, nuevamente, entre dieciséis, y así sucesivamente hasta que el cociente resultante sea inferior a dieciséis. Veamos un ejemplo:

Calcular el equivalente hexadecimal del decimal 613451D.

Hemos puesto en negrita los restos de las distintas divisiones y el último cociente. El equivalente hexadecimal se construye tomando estos números empezando por el último cociente y escribiéndolos de izquierda a derecha.

Entonces:

613451D = EFA1H

Recuerde nuevamente que el equivalente hexadecimal de 14D es EH, el de 15 es FH y el de 10D es AH.

Igual que en base diez, añadir ceros a la izquierda de un número entero hexadecimal no altera el valor. El mismo número representan 34AH y 0034AH.

El siguiente programa convierte un número decimal a hexadecimal.

10	REM PROGRAMA DE CONVERSION DE DECIMAL A HEXADECIMAL
20	LET B$=""
30	INPUT "NUMERO?=";A
40	IF A=0 THEN PRINT B$: GO TO 20
50	LET C=INT (A/16): LET R=A-16*C
60	LET C$=STR$ (R)
70	IF R>10 THEN LET C$=CHR$ (55+R)
80	LET B$=C$+B$
90	LET A=C
100	GO TO 40

Para la conversión de hexadecimal a decimal pruebe el siguiente programa:

10	REM PROGRAMA DE CONVERSION DE CUALQUIER BASE ENTRE 2 Y 16 A BASE 10
20	INPUT "BASE?=";B: IF B<2 OR B>16 THEN GO TO 140
30	INPUT "NUMERO?="; A$: LET C=0
40	FOR I=0 TO LEN (A$)-1
50	LET A=CODE (A$(LEN (A$)-I))
60	IF (A<48 OR A>57) AND (A<65 OR A>70) THEN GO TO 140
70	IF A>=48 AND A<=57 THEN LET A=A-48: GO TO 90
80	LET A=A-55
90	LET C=A*(B^I)+C
100	IF A>=BTHEN GO TO 140
110	NEXT I
120	PRINT C
130	GO TO 20
140	PRINT "ERROR": GO TO 20

En los dos programas anteriores, el número tecleado debe ser positivo.

Hasta aquí, hemos visto la conversión binaria ⇔ decimal y hexadecimal ⇔ decimal. Veamos ahora la conversión directa binario ⇔ hexadecimal.

La utilidad de la base dieciséis está precisamente en que la conversión binario — hexadecimal es sencilla, directa y rápida. Además, en base dieciséis se pueden representar con pocas cifras números que en base dos necesitarían una larga tira de «unos» y «ceros». Resulta muy cómodo referirse al valor de un byte (8 bits) o de una palabra (2 bytes = 16 bit) expresándolo en base dieciséis mejor que en binario o en decimal. Con algo de practica, es muy fácil —en seguida se llega a hacer mentalmente— conocer el valor de cada bit dentro del byte (o palabra).

Para la conversión directa de binario a hexadecimal separamos el número binario en grupos de cuatro bits, comenzando por la derecha. Si alguno faltara en el último grupo (el de la izquierda) se añaden ceros, lo que no altera el número. A continuación, convertimos cada grupo de cuatro bits a su dígito hexadecimal correspondiente (ver tabla 1), y los escribimos en el mismo orden. Por ejemplo, el número 10110011111B es en hexadecimal:

Y el número 101110100011B es en hexadecimal:

Obsérvese que un byte se puede representar con dos dígitos hexadecimales puesto que:

00000000B = 00H 11111111B = FFH = 255D

La conversión de hexadecimal a binario directa consiste en hacer justo lo contrario. Es decir, cada cifra hexadecimal se convierte a su equivalente binario (Tabla 1), escribiendo cada uno de los dígitos hexadecimales con cuatro bits y en el mismo orden. Por ejemplo, el hexadecimal, A31FH en binario sería:

y el

El hexadecimal:

FFFFH = 1111111111111111B = 65535D

se corresponde con la dirección más alta de la memoria del Spectrum de 64 Kbyte (1 Kbyte = 210 = 1024 bytes).

 
026/iniciacion.txt · Última modificación: d/m/Y H:i por miguel
Recent changes RSS feed Creative Commons License Driven by DokuWiki Made on Mac