Jugando con números en SuperBASIC

Para divertirnos con nuestro QL no solo tenemos los videojuegos del tipo “matamarcianos” y demás engendros, sino que también podemos emplear, a modo de diversión, nuestro querido SuperBASIC y un poco de ¡matemáticas!

Pues eso, proponemos en este post un simple ejercicio, convertir números decimales (en base 10) en sus equivalentes en binario y hexadecimal utilizando el SuperBASIC del QL.

Un “poquito” de teoría

El sistema binario es un sistema de numeración donde los números se representan utilizando solamente las cifras cero y uno (0 y 1). Es el sistema de numeración ideal para las computadoras ya que éstas trabajan internamente con dos niveles de voltaje (encendido 1, apagado 0).

El algoritmo utilizado para pasar de decimal a binario consiste en dividir el número del sistema decimal entre 2, cuyo resultado entero se vuelve a dividir entre 2, y así sucesivamente. Para construir el número binario debemos utilizar los restos de estas divisiones ordenados del último al primero. Obtendremos de esta manera una secuencia de unos y ceros que representará al número binario que buscamos.

Otro sistema de numeración muy utilizado en informática es el sistema hexadecimal que también es un sistema de numeración posicional de base 16 (empleando por tanto 16 símbolos, 0-9 y A-F). La justificación de la utilización de este sistema ses debido a que los ordenadores suelen utilizar el byte u octeto como unidad básica de memoria; y dos dígitos hexadecimales corresponden exactamente a un byte. Cada dígito hexadecimal representa 4 bits de información, llamado nibble.

El algoritmo es similar al anterior, sólo que debemos dividir por 16 y transformar el resto de la división (de 0 – 15) en un dígito hexadecimal.

La práctica

Veamos ahora el código fuente de un programa en SuperBASIC que transforma un número entero decimal en su equivalente binario y hexadecimal.

1000 REMark ------
1010 REMark Conversor de números decimal a binario / hexadecimal
1020 REMark -------
1030 :
1035 IniVariables
1040 :
1050 REPeat SecPrin
1060   n = PideNumero
1070   Binario$ = ConvierteBinario$ (n)
1080   Hexadecimal$ = ConvierteHexadecimal$ (n)
1090   AT 2,2: PRINT "- en binario es:"
1095   AT 2,25: PRINT Binario$
1100   AT 3,2: PRINT "- en hexadecimal es:"
1105   AT 3,25: PRINT Hexadecimal$
1110   IF Salir% = 1 THEN
1120      EXIT SecPrin
1130   END IF
1140 END REPeat SecPrin
1150 :
1160 :
1170 STOP
1180 :
1190 :
1200 DEFine PROCedure IniVariables
1210   Binario$ = ""
1220   Hexadecimal$ = ""
1230   n = 0
1235   DigHexa$ = "0123456789ABCDEF"
1240 END DEFine
1250 :
1260 :
1270 DEFine FuNction PideNumero
1280   LOCal nn
1290   INK 7:PAPER 0:CLS
1300   INPUT "Introduce un número entero positivo entre 1 y 65535: ", nn
1310   RETurn nn
1320 END DEFine
1330 :
1340 :
1350 DEFine FuNction ConvierteBinario$ (num)
1360   LOCal nB$, byteHi%, byteLo%
1370   nB$ = ""
1380   IF num < 256 THEN
1390     nB$ = ByteBinario$(num)
1400   ELSE
1410     byteHi% = INT(num / 256)
1420     byteLo% = num - 256 * byteHi%
1430     nB$ = ByteBinario$(byteHi%) & ByteBinario$(byteLo%)
1450   END IF
1460   RETurn nB$
1470 END DEFine
1480 :
1490 :
1500 DEFine FuNction ByteBinario$ (num)
1510   LOCal cadB$, i, nTmp, resto%, numX
1520   numX = num
1530   cadB$ = ""
1540   FOR i = 8 TO 1 STEP -1
1550     nTmp = INT(numX / 2)
1560     resto% = numX - 2 * nTmp
1570     cadB$ = CHR$(48 + resto%) & cadB$
1580     numX = nTmp
1590   END FOR i
1600   RETurn cadB$
1610 END DEFine
1620 :
1630 :
1640 DEFine FuNction ConvierteHexadecimal$ (num)
1650   LOCal cadH$, byteHi%, byteLo%
1660   cadH$ = ""
1670   IF num < 256 THEN
1680     cadH$ = ByteHexa$(num)
1690   ELSE
1695     byteHi% = INT(num / 256)
1697     byteLo% = num - byteHi% * 256
1698     cadH$ = ByteHexa$(byteHi%) & ByteHexa$(byteLo%)
1699   END IF
1720   RETurn cadH$
1730 END DEFine
1740 :
1750 :
1760 DEFine FuNction ByteHexa$(num)
1770   LOCal cadH$, nibH%, nibL%
1780   nibH% = INT(num/16)
1790   nibL% = num - nibH% * 16
1800   cadH$ = DigHexa$(nibH% + 1) & DigHexa$(nibL% + 1)
1810   RETurn cadH$
1820 END DEFine
1830 :
1840 :
1850 DEFine FuNction Salir%
1860   LOCal t$, r%
1870   r% = 0
1880   PRINT: INK 4
1890   PRINT "(S)alir / (O)tro n™mero"
1900   REPeat tecla
1910     t$ = INKEY$(-1)
1920     IF t$ = "s" OR t$ = "S" THEN r% = 1: EXIT tecla
1930     IF t$ = "o" OR t$ = "O" THEN r% = 0: EXIT tecla
1940     BEEP 100,100
1950   END REPeat tecla
1960   RETurn r%
1970 END DEFine

El ejemplo es incompleto, sólo convierte números entre 0 y 65535, ¿quien se anima a mejorarlo para ampliar este rango? ….

Para saber más

http://es.wikipedia.org/wiki/Sistema_binario
http://es.wikipedia.org/wiki/Sistema_hexadecimal

Anuncios
4 comentarios
  1. Salvador Merino dijo:

    En primer lugar, un programa SuperBasic autentico muy estructurado, y un buen uso de las definiciones de procedimientos y funciones, y además, variables locales (En los años 80, los primeros programadores SuperBASIC usaban mucho los GOTOs, y GOSUBs, y nada de variables locales).

    Si alguien necesita trabajar con números más grandes, hay programas o toolkits en la librería QUANTA e IFE para trabajar con números enteros de hasta 80 dígitos.

    El cómo trabajar en SuperBasic con números enteros de 64 bits es bastante sencillo, yo lo hice en SuperFORTH (y un poquillo de assembler 68000), y lo publique en CUQ nº4 Enero 1989 (Practicando con el SuperFORTH (IX)), y también lo publicaron en la revista QUANTA.

    El algoritmo usado es el mismo que usaban en los micros de 8 bits para poder realizar sumas, restas, multiplicaciones de 16 bits o 32 bits con un micro que usaba registros de solamente 8 bits.

    En resumidas cuentas, para almacenar en el SuperBasic un número entero de 32 bits se necesita primero haber creado una pila de datos, o una variable, con una reserva de memoria de 4 bytes (para 64 bits son necesarios 8 bytes).

  2. afx dijo:

    Curioso, parece simple el mecanismo para añadir extensiones a SuperForth empleando código en ensamblador (con el macroensamblador de Metacomco).

    La estrategia del tratamiento de número de 64 bits parece simple también, tratar el número en “cachitos” de 16 bits.

    PD:
    En la introducción del artículo nombras el lio que provocó la disolución de Qlave, … nunca he sabido los motivos reales … ya contarás.

    • Salvador Merino dijo:

      Bueno, en realidad QLAVE no sé exactamente cuando el último Presidente/Vicepresidente/Secretario/Tesorero/Librero (Léase, Diego Alcalá), decidió su disolución, porque CUQ en realidad era un grupo local de Qlave en Málaga (reducido en los últimos días de QLave a un sólo socio), que decide crear un Club paralelo liderado por los grupos locales de Qlave, porque el Club original con sede en Zaragoza está agonizando de muerte (Y arruinado por la mala gestión del Presidente).

      Si los historiadores, repasaran la historia, hoy podrían llegar a la conclusión de que en el Club QL Español hubo una guerra civil entre los socios. Por un lado, un socio se hizo con todos los poderes de la Junta Directiva con lo que podría denominarse un golpe de estado, y por el otro lado, las colonias, o autonomías (léase, grupos locales), se independizaron creando un nuevo club.

      También si se repasa la historia, en el año 1987 y 1988, el mundo QL estaba dividido en un mínimo de 2 bandos que luchaban entre si por sentarse en el trono del Sinclair QL (Léase, QLT y THOR), lo que significa que la propia Comunidad QL estaba sumergida en su propia guerra civil. Desgraciadamente, ninguno pudo conseguir la suficiente financiación, porque en el año 1988 empezó una crisis que duro hasta finales de 1994 (ATARI y AMIGA cayeron victimas de esa crisis, y Apple se salvo por los pelos (Gracias a que Microsoft compro un paquete de acciones de Apple para que no quebrara, y para que no le acusaran de Monopolio en USA), e incluso los PCs estaban con las ventas estancadas y en dificultades).

  3. afx dijo:

    Ingeniosa esa metáfora de las “guerras civiles” dentro del mundo QL … y la independización de las autonomías :-). Lo peor de esa época para el QL fue que la maquina nunca tuvo una segunda oportunidad para recuperar la confianza en si misma.

    Sobre lo que comentas de la caída de Atari y Amiga, nunca lo relacione con la crisis que comentas, sino con la piratería (o el modelo de negocio equivocado de esas compañías) y el “rodillo” que aplico el PC.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s