Saltar al contenido

¿Cómo realizar la multiplicación, usando operadores bit a bit?

El paso a paso o código que encontrarás en este post es la resolución más eficiente y válida que encontramos a tu duda o dilema.

Solución:

Para multiplicar por cualquier valor de 2 a la potencia de N (es decir, 2^N) desplaza los bits N veces hacia la izquierda.

0000 0001 = 1 

times 4 = (2^2 => N = 2) = 2 bit shift : 0000 0100 = 4

times 8 = (2^3 -> N = 3) = 3 bit shift : 0010 0000 = 32

etc..

Para dividir desplazar los bits a la derecha.

Los bits son 1 o 0 completos: no puede cambiar una parte de un bit, por lo tanto, si el número por el que está multiplicando no factoriza un valor completo de N, es decir.

since: 17 = 16  + 1 
thus:  17 = 2^4 + 1

therefore: x * 17 = (x * 16) + x in other words 17 x's  

por lo tanto, para multiplicar por 17, debe hacer un desplazamiento de 4 bits hacia la izquierda y luego agregar el número original nuevamente:

==> x * 17 = (x * 2^4) + x 
==> x * 17 = (x shifted to left by 4 bits) + x 

so let x = 3 = 0000 0011 

times 16 = (2^4 => N = 4) = 4 bit shift : 0011 0000 = 48

plus the x (0000 0011)

es decir.

    0011 0000  (48)  
+   0000 0011   (3)
=============
    0011 0011  (51)

Editar: Actualizar a la respuesta original. Charles Petzold ha escrito un libro fantástico, ‘Código’, que explicará todo esto y más de la forma más sencilla. Lo recomiendo totalmente.

Para multiplicar dos números codificados en binario sin una instrucción de multiplicación. Sería simple agregar iterativamente para llegar al producto.

unsigned int mult(x, y)
unsigned int x, y;

    unsigned int reg = 0;

    while(y--)
        reg += x;
    return reg;

Usando operaciones de bits, la característica de la la codificación de datos puede ser explotada. Como se explicó anteriormente, un cambio de bit es lo mismo que multiplicar por dos. Usando esto, se puede usar un sumador en las potencias de dos.

// multiply two numbers with bit operations

unsigned int mult(x, y)
unsigned int x, y;

    unsigned int reg = 0;

    while (y != 0)
    
        if (y & 1)
        
            reg += x;
        
        x <<= 1;
        y >>= 1;
    
    return reg;

Factorizarías el multiplicando en potencias de 2.
3*17 = 3*(16+1) = 3*16 + 3*1 … = 0011b << 4 + 0011b

Valoraciones y reseñas

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *