巧用移位運算避免乘法運算

2021-04-09 11:08:50 字數 1096 閱讀 1291

使用移位運算來避免乘法運算是一種常用技巧,不過乘數必須都是正整數,而且必須至少有

乙個是 2 的 n 次方,例如:2,4,8,16,32……移位運算的特點是速度快,而乘法運算速度較慢,

把乘法運算轉化為移位運算可以稍微提高程式執行效率。例如:

num *= 32;

等同於num <<= 5; /* 2 的 5 次方等於 32 */

如果乘數不是 2 的 n 次方,我們可以把乘數分解成幾個 2 的 n 次方的和:

num *= 20;

等於num *= (16 + 4);

等於num = num * 16 + num * 4;

等於num = (num << 4) + (num << 2);

不過,現在的編譯器很聰明,它們會代替我們做這種優化。也就是說,如果我們寫的語句是:

num *= 100;

編譯器會把這個語句優化為:

num = (num << 6) + (num << 5) + (num << 2);

所以,我們沒有必要手工進行這種優化,因為編譯器會替我們完成。而且,就算進行了這種優化,速度也不會

有太大提高。我們應該把精力用來改進演算法,乙個好的演算法可以讓程式執行效率大大提高! 

但是凡事都有乙個度,採用移位運算,要注意不要超過該資料型別的精度(資料範圍),比如請看下面乙個例子(c++版)

#include

void main()

猜下結果是多少,呵呵......

上面的那個程式,我們要注意精度問題,在32級win32 int型佔4個位元組,精度範圍在(-2147483647,2147483647)直接,上面的剛好處於下限,我如果說結果是2很讓初學者感到困惑.但如果我們靜下心來仔細看看最基本的計算機基礎知識,其實很簡單.....

-2147483647

原碼:11111111111111111111111111111111(32個1)

補碼:10000000000000000000000000000001

10000000000000000000000000000001左移一位,最高位1沒有了,最低位左移一位,等到2

就這麼簡單,呵呵,在學習高階語言的時候別忘了最基本的知識!!!

使用移位和加法運算替代乘法運算

因為工作中遇到頻繁操作乘法運算導致用時過多的情況,特找了下替代方案,但實測效果並不理想,暫做記錄。include include include include define max nm a,b a b?a b define min nm a,b a b?a b define repeat num...

《使用移位運算來避免乘法運 C 第八周》

對任務及求解方法的描述部分 問題描述 移位運算的特點是速度快,使用移位運算來避免乘法運算是一種常用技巧。不過乘數必須都是正整數,而且必須至少有乙個是 2 的 n 次方。例如 num 32 等同於num 5 2 的 5 次方等於 32 如果乘數不是 2 的 n 次方,則可以把乘數分解成幾個 2 的 n...

定點運算(一) 移位運算

移位 為什麼要移位?在計算機裡面,移位操作可以與加減法操作一起構成乘除法運算。注意 因為計算機裡面沒有專門的硬體來表示小數點,小數點是人為約定的 這就說明小數點的位置是不可變的。即移位操作動的是資料而不是小數點。移位的規則 符號位不變,因為負數移位之後還是負數,不可能因為乙個移位就變成正數了,下面是...