2012-05-25 13 views
7

pregunta simple, pero no puedo parecer bastante para averiguarlo:Bitshifting para multiplicar un número entero por 10

si tengo un número entero, por ejemplo 12, y realizar el siguiente bit a la manipulación en él:

int i = 12;
i = (i << 3) + (i << 1);

I terminar con 120 (12 * 10). Este es el caso con cualquier número.

¿Puede alguien explicarme, de manera sucinta, por qué es que esto funciona? (Obviamente me falta algo bastante rudimentario cuando se trata de cambiar bits).

Gracias

+3

¿Conoce cómo Bitshifting funciona? 'i << 3' es i * (2^3) o i * 8, y' i << 1' es i * (2^1) o i * 2, así que si los agrega, obtiene i * 10 . –

+0

He're you go: http://en.wikipedia.org/wiki/Multiplication_algorithm#Shift_and_add – Stefan

+2

También tenga en cuenta que cualquier compilador * decente lo hará mejor que usted ... Simplemente use la multiplicación simple y el optimizador hará lo que sea mejor para ti en la plataforma actual. –

Respuesta

17

Express como la multiplicación.

i = (i << 3) + (i << 1); 
i = (i * 8) + (i * 2); 
i = 8i + 2i 
i = 10i 
5

Usted está haciendo básicamente:

i = i*2^3 + i*2 
0

Vuelva a escribir los cambios de bits como multiplicaciones por potencias-de-2, y todo debe quedar claro.

1

cambiantes dejado por 3 lugares es igual a multiplicar por 8, pasando por los lugares 1 es igual a multiplicar por 2, de modo que está haciendo

i = i * 8 + i * 2 
2

i << 3 es equivalente a i * 8. i << 1 es equivalente a i * 2.

El distribute property nos dice que:

x = i * 10 
x = i * (8 + 2) 
x = 8i + 2i 
1

BitShift izquierda es el mismo (por lo general) que multiplicar por el poder de de dos. es decir, es equivalente a << 1*(2^1), << 2 es equivalente a *(2^2) y así sucesivamente ...

Si sustituyes que en su ejemplo se puede ver por qué su resultado se multiplica por 10:

int i = 12; 
i = (i * 2^3) + (i * 2^1); 
= { i = (i * 8) + (i * 2);} 
= { i = 8i + 2i; } 
= { i = 10i; } 
Cuestiones relacionadas