El código que encontró intenta explicar cómo un hardware informático muy primitivo podría implementar una instrucción de "agregar". Digo "podría" porque puedo garantizar que este método no es utilizado por ninguna CPU, y explicaré por qué.
En la vida normal, usa números decimales y ha aprendido a sumarlos: para sumar dos números, suma los dos dígitos más bajos. Si el resultado es menor que 10, anote el resultado y proceda a la siguiente posición del dígito. Si el resultado es 10 o más, anote el resultado menos 10, proceda al siguiente dígito, compre recuerde agregar 1 más. Por ejemplo: 23 + 37, sumas 3 + 7 = 10, escribes 0 y recuerdas agregar 1 más para la siguiente posición. En la posición de las decenas, agrega (2 + 3) + 1 = 6 y anótalo. El resultado es 60.
Puede hacer exactamente lo mismo con los números binarios. La diferencia es que los únicos dígitos son 0 y 1, por lo que las únicas sumas posibles son 0, 1, 2. Para un número de 32 bits, manejaría una posición de dígito tras otra. Y así es como lo haría un hardware informático realmente primitivo.
Este código funciona de manera diferente. Sabes que la suma de dos dígitos binarios es 2 si ambos dígitos son 1. Entonces, si ambos dígitos son 1, agregarías 1 más en la siguiente posición binaria y escribirías 0. Eso es lo que hace el cálculo de t: Encuentra todos los lugares donde ambos dígitos binarios son 1 (que es el &) y los mueve a la siguiente posición de dígito (<< 1). Luego hace la suma: 0 + 0 = 0, 0 + 1 = 1, 1 + 0 = 1, 1 + 1 es 2, pero escribimos 0. Eso es lo que hace el operador excluyente o.
Pero todos los 1 que tuvo que manejar en la posición del siguiente dígito no se han manejado. Aún deben agregarse. Es por eso que el código hace un bucle: en la siguiente iteración, se agregan todos los 1 adicionales.
¿Por qué ningún procesador lo hace de esa manera? Porque es un bucle, y a los procesadores no les gustan los bucles, y es lento. Es lento, porque en el peor de los casos, se necesitan 32 iteraciones: si agrega 1 al número 0xffffffff (32 bits 1), la primera iteración borra el bit 0 de y y establece x en 2. La segunda iteración borra el bit 1 de y y establece x en 4. Y así sucesivamente. Se necesitan 32 iteraciones para obtener el resultado. Sin embargo, cada iteración tiene que procesar todos los bits de xey, lo que requiere mucho hardware.
Un procesador primitivo haría las cosas tan rápido como usted hace la aritmética decimal, desde la posición más baja hasta la más alta. También requiere 32 pasos, pero cada paso procesa solo dos bits más un valor de la posición del bit anterior, por lo que es mucho más fácil de implementar. E incluso en una computadora primitiva, uno puede permitirse hacer esto sin tener que implementar bucles.
Una CPU moderna, rápida y compleja utilizará un "sumador de suma condicional". Especialmente si el número de bits es alto, por ejemplo, un sumador de 64 bits, ahorra mucho tiempo.
Un sumador de 64 bits consta de dos partes: Primero, un sumador de 32 bits para los 32 bits más bajos. Ese sumador de 32 bits produce una suma y un "acarreo" (un indicador de que se debe agregar un 1 a la siguiente posición de bit). En segundo lugar, dos sumadores de 32 bits para los 32 bits más altos: uno suma x + y, el otro suma x + y + 1. Los tres sumadores funcionan en paralelo. Luego, cuando el primer sumador ha producido su acarreo, la CPU simplemente elige cuál de los dos resultados x + yox + y + 1 es el correcto, y usted tiene el resultado completo. Por lo tanto, un sumador de 64 bits solo tarda un poco más que un sumador de 32 bits, no el doble.
Las partes sumadoras de 32 bits se implementan de nuevo como sumadores condicionales, utilizando múltiples sumadores de 16 bits, y los sumadores de 16 bits son sumadores condicionales, y así sucesivamente.
add
instrucción de máquina nativa , que supongo que casi todas las CPU tienen e implementadas como sumadores de hardware que funcionan en unos pocos relojes.