2012-05-25 15 views
7

proste pytanie, ale nie mogę dość wydają się zrozumieć to:Bitshifting pomnożyć liczbę całkowitą przez 10

Jeśli mam całkowitą, powiedzmy 12, a ja wykonać następujące Bit-manipulacji na nim:

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

Kończę z 120 (12 * 10). Tak jest w przypadku dowolnej liczby.

Czy ktoś może mi wyjaśnić, zwięźle, dlaczego to działa? (Oczywiście brakuje mi czegoś bardzo szczątkowego, jeśli chodzi o bitshift).

Dzięki

+3

Czy wiesz jak bitshifting działa? 'i << 3' to i * (2^3) lub i * 8, a' i << 1' to i * (2^1) lub i * 2, więc jeśli je dodasz, otrzymasz i * 10 . –

+0

Idziesz: http://en.wikipedia.org/wiki/Multiplication_algorithm#Shift_and_add – Stefan

+2

Zauważ, że każdy * dobry * kompilator zrobi to lepiej niż ty ... Wystarczy użyć zwykłego mnożenia, a optymalizator zrobi to, co jest najlepiej dla ciebie na obecnej platformie. –

Odpowiedz

17

Express mnożenia.

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

Przepisz bity jako mnożenie przez potęgi-2, a wszystko powinno stać się jasne.

1

przesuwanie w lewo przez 3 miejsc jest równa pomnożenie przez 8, przesunięcie o 1 miejsc jest równa pomnożenie przez 2 tak robisz

i = i * 8 + i * 2 
1

Lewy Bitshift jest taka sama (zwykle) jako mnożenie przez moc na dwóch. tj << 1 jest równoważna *(2^1), << 2 jest równoważna *(2^2) i tak dalej ...

Jeśli zastąpić że na swoim przykładzie można zobaczyć, dlaczego wynik jest mnożony przez 10:

int i = 12; 
i = (i * 2^3) + (i * 2^1); 
= { i = (i * 8) + (i * 2);} 
= { i = 8i + 2i; } 
= { i = 10i; } 
Powiązane problemy