簡單的問題乘以一個整數,但我不能完全似乎弄明白:Bitshifting 10
如果我有一個整數,說12,我就可以執行以下位操作:
int i = 12;
i = (i << 3) + (i << 1);
我結束了120(12×10)。任何數字都是如此。
有人可以簡單地向我解釋爲什麼這是有效的嗎? (當談到偏移時,我顯然錯過了一些非常基本的東西)。
感謝
簡單的問題乘以一個整數,但我不能完全似乎弄明白:Bitshifting 10
如果我有一個整數,說12,我就可以執行以下位操作:
int i = 12;
i = (i << 3) + (i << 1);
我結束了120(12×10)。任何數字都是如此。
有人可以簡單地向我解釋爲什麼這是有效的嗎? (當談到偏移時,我顯然錯過了一些非常基本的東西)。
感謝
快速乘法。
i = (i << 3) + (i << 1);
i = (i * 8) + (i * 2);
i = 8i + 2i
i = 10i
你基本上是這樣做的:
i = i*2^3 + i*2
將位移重寫爲乘2的乘法運算,所有都應該變清楚。
移動由3個地方留下等於乘以8,由1位移,所以你正在做
i = i * 8 + i * 2
i << 3
相當於i * 8
等於乘以2。 i << 1
相當於i * 2
。
的distribute property告訴我們:
x = i * 10
x = i * (8 + 2)
x = 8i + 2i
左位位移是相同的(通常)由兩個功率的相乘。即<< 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; }
你知道如何偏移的作品? 'i << 3'爲i *(2^3)或i * 8,'i << 1'爲i *(2^1)或i * 2,所以如果加上這些,就得到i * 10 。 –
他你去了:http://en.wikipedia.org/wiki/Multiplication_algorithm#Shift_and_add – Stefan
還要注意,任何*體面*編譯器會做得比你更好...只需使用普通乘法,優化器將做什麼最適合你當前的平臺。 –