Para la multiplicación a nivel de bits, los ordenadores se aprovechan del hecho de que es muy fácil multiplicar por 2 en binario.
En decimal, multiplicar por 10 es fácil, porque esa es la base del sistema numérico. Si quieres multiplicar, digamos, 56 por 10, todo lo que tienes que hacer es añadir un cero al final y obtienes 560.
De forma similar, en binario, digamos que quieres multiplicar 9, que es 1001 expresado en binario por 2. Todo lo que tienes que hacer es añadir un cero al final: La respuesta es 10010.
Eso está muy bien, pero ¿cómo se multiplica por un número que no es 2? Digamos que quieres multiplicar 9 por 11, es decir, 1001 x 1011 en binario. Tenga en cuenta que escribir 11 de esta manera realmente significa lo siguiente:
[math](11)_{10} = (1011)_2 = 1cdot 2^3 + 0cdot 2^2 + 1cdot 2^1 + 1cdot 1^0 = 1cdot 8 + 0cdot 4 + 1cdot 2 + 1cdot 1[/math]
(Todos los números después del segundo signo igual están en decimal, por si no queda claro)
(Todos los números después del segundo signo igual están en decimal, por si no queda claro);no está claro)
Así que esto significa (por la lav distributiva):
[math]9cdot 11 = 9cdot (8 + 2 + 1) = 9cdot 8 + 9cdot 2 + 9cdot 1[/math]
(Esta vez, todo está en decimal). Así que si sólo podemos encontrar los tres términos del lado derecho y sumarlos, ya hemos terminado. Resulta que todas estas multiplicaciones simplemente equivalen a sumar ceros en binario:
[math](1001)_2 cdot 1 = (1001)_2[/math]
[math](1001)_2 cdot 2 = (10010)_2[/math]
[math](1001)_2 cdot 4 = (100100)_2[/math]
[math](1001)_2 cdot 8 = (1001000)_2[/math]
(I'he incluido el caso 4 aunque técnicamente no es necesario). Ahora podemos sumar los términos relevantes para obtener:
[math](1001)_2 cdot (1011)_2 = (1001000)_2 + (10010)_2 + (1001)_2 = (1100011)_2[/math]
Esto es exactamente 99 en decimal.
Este algoritmo es fácil de generalizar: sólo hay que sumar ceros (lo que a veces se conoce como "desplazamiento", ya que básicamente se están desplazando todos los dígitos a la izquierda) y sumar.
Esto puede parecer arcano hoy en día, pero en realidad he implementado esto en el lenguaje ensamblador del Commodore 64, ya que el procesador no tenía ninguna operación de multiplicación a nivel de la CPU.
Quizás más interesante, me quedé bastante desconcertado cuando más tarde aprendí (en la escuela secundaria) que esto era en realidad exactamente cómo los antiguos egipcios hacían la multiplicación. Obviamente, la notación era diferente, pero aún así es genial que hayan inventado un algoritmo tan "moderno" en ese entonces.
En cuanto a la división, es un poco más difícil, pero es básicamente lo mismo que la división larga. Lo dejaré para que alguien más ponga un ejemplo.