Hola Compañeros
Recuerdo una vez en el que tuve que hacer un proyecto en que tenía que pasar un número decimal a uno o más displays de 7 segmentos (más sencillo de decir; separar decimal en dígitos).
Siempre usé la forma clásica (La primera que se nos viene a la cabeza) y es la de usar divisiones y multiplicaciones.
Si bien este "algoritmo" funciona a la perfección, me vi obligado a saber sus debilidades, cómo la cantidad excesiva de tiempo que tardaba un micro en hacerlo (alrededor de 300 instrucciones).
Hace unos meses en la facultad, oh sorpresa! nos tocó una teoría muy interesante en informática que trataba la conversión de un Binario a un BCD que hasta su momento desconocía.
Y bueno, resumiendo logré hacer lo mismo pero casi 7 veces más eficiente.
Lo que me liberó un montón de preciados tiempos en el micro, incluso lograr mucho más que un barrido aceptable en 5 displays!
El programita está hecho en basic, pero considero que es extremadamente fácil su conversión a otro lenguaje como el C.
El algoritmo es Doble Dabble (Desplazar y sumar 3):
ALGORITMO (numero de 4bits en adelante)
(consider 8-bit binary)
1. Shift the binary number left one bit.
1. Desplazar nuestro número 1 bit a la izquierda
2. si en cualquiera de los cajones nibble el número es mayor igual a 5, se le sumará 3 al nibble donde se encontró
3. Repetimos hasta haber desplazado la misma cantidad de veces que cantidades de bits tenia nuestro número
Siguiendo esto y la foto como guía, creé un algoritmo en que mi número inicial (Long de 4 bytes) "number" se cargaba en otro long llamado "binario".
El porqué hice esto, es fácil de responder:
El BASIC me permite un máximo de variables de 4 bytes o mejor dicho 32 bits.
Si desplazaba y hacia todo sobre mi número inicial 32 bits no sería suficiente para un número de 16 bits, si bien se desplazaría 16 veces hay que tener en cuenta que un número en BDC es mayor a uno binario.
Algoritmo dentro de un for que se repetirá las mismas veces que la cantidad de bits de mi número inicial
Función que calcula cuando se suma 3 y cuando no:
Bueno, esto es todo, creo que es algo muy útil de implementar en cualquier sistema en el que los tiempos y la eficiencia es una prioridad. (Siempre debería serlo). Saludos!
P.D.: Adjunto las fotos ...
Recuerdo una vez en el que tuve que hacer un proyecto en que tenía que pasar un número decimal a uno o más displays de 7 segmentos (más sencillo de decir; separar decimal en dígitos).
Siempre usé la forma clásica (La primera que se nos viene a la cabeza) y es la de usar divisiones y multiplicaciones.
Código:
number = 15623
_d1 = number / 10000
_d2 = number / 1000 - 10 * _d1
_d3 = number / 100 - 100 * _d1 - 10 * _d2
_d4 = number / 10 - 1000 * _d1 - 100 * _d2 - 10 * _d3
_d5 = number / 1 - 10000 * _d1 - 1000 * _d2 - 100 * _d3 - 10 * _d4
Hace unos meses en la facultad, oh sorpresa! nos tocó una teoría muy interesante en informática que trataba la conversión de un Binario a un BCD que hasta su momento desconocía.
Y bueno, resumiendo logré hacer lo mismo pero casi 7 veces más eficiente.
Lo que me liberó un montón de preciados tiempos en el micro, incluso lograr mucho más que un barrido aceptable en 5 displays!
El programita está hecho en basic, pero considero que es extremadamente fácil su conversión a otro lenguaje como el C.
El algoritmo es Doble Dabble (Desplazar y sumar 3):
ALGORITMO (numero de 4bits en adelante)
(consider 8-bit binary)
1. Shift the binary number left one bit.
1. Desplazar nuestro número 1 bit a la izquierda
2. si en cualquiera de los cajones nibble el número es mayor igual a 5, se le sumará 3 al nibble donde se encontró
3. Repetimos hasta haber desplazado la misma cantidad de veces que cantidades de bits tenia nuestro número
Siguiendo esto y la foto como guía, creé un algoritmo en que mi número inicial (Long de 4 bytes) "number" se cargaba en otro long llamado "binario".
El porqué hice esto, es fácil de responder:
El BASIC me permite un máximo de variables de 4 bytes o mejor dicho 32 bits.
Si desplazaba y hacia todo sobre mi número inicial 32 bits no sería suficiente para un número de 16 bits, si bien se desplazaría 16 veces hay que tener en cuenta que un número en BDC es mayor a uno binario.
Algoritmo dentro de un for que se repetirá las mismas veces que la cantidad de bits de mi número inicial
Código:
Dim number As Long
Dim i As Byte
Dim binario As Long
binario = 0
number =15623
For i = 0 To 15
binario = mayor_que_cinco(binario) \'-----Busco 1 o mas nibble en binario y les sumo 3 solo a los que resultaron mayores igual a 5
binario = ShiftLeft(binario, 1) \'--------Desplazo Binario 1 paso a la izquierda
binario.0 = number.15 \'------------------Cargo en el bit 0 de binario el bit 15 de number
number = ShiftLeft(number, 1) \'----------Desplazo number 1 paso a la izquierda
Next i
Código:
Function mayor_que_cinco(lng As Long) As Long
Dim bt As Byte
Dim nl As Long
nl = lng
bt = 0
bt.0 = nl.0
bt.1 = nl.1
bt.2 = nl.2
bt.3 = nl.3
If bt >= 5 Then bt = bt + 3
nl.0 = bt.0
nl.1 = bt.1
nl.2 = bt.2
nl.3 = bt.3
bt.0 = nl.4
bt.1 = nl.5
bt.2 = nl.6
bt.3 = nl.7
If bt >= 5 Then bt = bt + 3
nl.4 = bt.0
nl.5 = bt.1
nl.6 = bt.2
nl.7 = bt.3
bt.0 = nl.8
bt.1 = nl.9
bt.2 = nl.10
bt.3 = nl.11
If bt >= 5 Then bt = bt + 3
nl.8 = bt.0
nl.9 = bt.1
nl.10 = bt.2
nl.11 = bt.3
bt.0 = nl.12
bt.1 = nl.13
bt.2 = nl.14
bt.3 = nl.15
If bt >= 5 Then bt = bt + 3
nl.12 = bt.0
nl.13 = bt.1
nl.14 = bt.2
nl.15 = bt.3
bt.0 = nl.16
bt.1 = nl.17
bt.2 = nl.18
bt.3 = nl.19
If bt >= 5 Then bt = bt + 3
nl.16 = bt.0
nl.17 = bt.1
nl.18 = bt.2
nl.19 = bt.3
mayor_que_cinco = nl
End Function
P.D.: Adjunto las fotos ...
Adjuntos
Última edición por un moderador: