2012-05-25 69 views
7

簡單的問題乘以一個整數,但我不能完全似乎弄明白:Bitshifting 10

如果我有一個整數,說12,我就可以執行以下位操作:

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

我結束了120(12×10)。任何數字都是如此。

有人可以簡單地向我解釋爲什麼這是有效的嗎? (當談到偏移時,我顯然錯過了一些非常基本的東西)。

感謝

+3

你知道如何偏移的作品? 'i << 3'爲i *(2^3)或i * 8,'i << 1'爲i *(2^1)或i * 2,所以如果加上這些,就得到i * 10 。 –

+0

他你去了:http://en.wikipedia.org/wiki/Multiplication_algorithm#Shift_and_add – Stefan

+2

還要注意,任何*體面*編譯器會做得比你更好...只需使用普通乘法,優化器將做什麼最適合你當前的平臺。 –

回答

17

快速乘法。

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

你基本上是這樣做的:

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

將位移重寫爲乘2的乘法運算,所有都應該變清楚。

1

移動由3個地方留下等於乘以8,由1位移,所以你正在做

i = i * 8 + i * 2 
2

i << 3相當於i * 8等於乘以2。 i << 1相當於i * 2

distribute property告訴我們:

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

左位位移是相同的(通常)由兩個功率的相乘。即<< 1相當於*(2^1)<< 2相當於*(2^2)等等...

如果替代品到您的例子,你可以看到爲什麼你的結果乘以10:

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