026:iniciacion

¡Esta es una revisión vieja del documento!


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

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:

613451) = EFA1H Recuerde nuevamente que el equivalente hexadecimal de 141) es EH, el de 151) es FH y el de 10L) 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 r hexrdecimal

20 let b $ = “ ”

30 input “nunero?=”;a

4-0 if fl =0 then print b* go to 20

50 let c=int (fl/16): let r=fl-1 6*c

60 let c*=str$ ®

70 if r > 10 then let c»=chr$ (5 5 + r)

80 let b$=c$+bí

90 let r=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 ? = ” i B: IF B < 2 OR B >16 THEN GO TO 140 30 INPUT “numero?=”,A$ LET C=

0

40 FOR 1=0 TO LEN (A$)-1 50 LET A=CODE (A»(LEN <A$)-I)) 60 IF (A < 48 OR A > 57) HNO (A<55 OR A > 70 J THEN GO TO 140

70 IF A>=48 AND A⇐57 THEN LET A=A-48: GO TO 90 30 LET A = A-55 90 LET C = A* IBtI) +í 100 IF A > =B THEN 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 binariohexadecimal.

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, co-

menzando 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 I), y los escribimos en el mismo orden. Por ejemplo, el número 10110011111B es en hexadecimal:

01011001111 IB = 59FH \___/

II II II 5 9 F Y el número 101110100011B es en hexadecimal:

J 01 U 010P01 \ B = BA3H II II II B A 3 Obsévese que un byte se puede representar con dos dígitos hexadecima-les puesto que:

00000000B = 00H 1111111 IB = FFH = 2551) 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:

A31F11 = 101000111)001,111 IB

II II II II A 3 1 F

y el

3 E911=001111101001 B= 1111101001B II li II

3 E 9

F.I hexadecimal:

FFFFI1 = 111111111111111 IB = = 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.1441894073.txt.gz
  • Última modificación: d/m/Y H:i
  • por miguel