Nidhin usó la multiplicación, voy a usar justo lo contrario (división), pero en realidad será solo un grupo de restas, fácil de hacer con un sumador.
Primero, asumiré que todos los dígitos ASCII se han convertido a BCD (decimal codificado en binario) al desactivar el 0x30 (lo que hace que cada uno de los dígitos sea de 4 bits en lugar de 8).
Tomemos un par de ejemplos. Convertir 26 (decimal) a 1A (hex)
0010 0110 => 0001 1010
El dígito más a la derecha de nuestra respuesta tiene un "peso" de 1, y el dígito izquierdo un "peso" de 16. Esto se debe a que hay dos "nibbles" de cuatro bits en la respuesta y el peso del quinto bit es 16 :
128 64 32 16 8 4 2 1
Entonces restaremos 16 repetidamente y usaremos el número de sustracciones exitosas como el dígito izquierdo de la respuesta. Lo que queda se convierte en el dígito correcto.
Si restamos 16 de 26, obtenemos diez. Como solo podemos hacer esto una vez (sin que se vuelva negativo), el dígito izquierdo se convierte en 1 y el dígito derecho es A (10).
26
-16 -> 1 (since we did this once)
---
10 -> A so the answer is 1A or 0001 1010
(done because 10 < 16)
Un ejemplo más largo:
Convierta 92 (decimal) a 5C (hex).
1001 0010 => 0101 1100
92
-16
---
76
-16
---
60
-16
---
44
-16
---
28
-16 -> 5 (since we subtracted 5 times, this is where the counter would be useful)
---
12 -> C so the answer is 5C or 0101 1100
(done because 12 < 16)
Tenga en cuenta que aunque estoy mostrando aritmética decimal (por ejemplo, 92 - 16), esto se está haciendo realmente en BCD, un mordisco de 4 bits para cada dígito ASCII.
Por lo tanto, restar 16 de 92 en realidad debe hacerse usando un sumador BCD. No es tan complicado como parece, aquí hay un ejemplo:
1001 0010 92
- 0001 0110 16
----------
1000 1100 80 + -4 because it's negative, we'll add 10 back and propagate the carry
0001 1010
----------
0111 0110 76, which is the correct answer (see above)