C語言中乘除法與移位關係
阿新 • • 發佈:2019-02-06
微控制器程式設計中移位運算比乘除法效率更高,當然用移位運算替代乘除法程式碼會有點晦澀。下面記錄下自己學習的內容以做備忘。
用移位實現乘除法運算
a=a*8;
b=b/8;
可以改為:
a=a<<3;
b=b>>3;
說明:
除2 = 右移1位; 乘2 = 左移1位
除4 = 右移2位; 乘4 = 左移2位
除8 = 右移3位; 乘8 = 左移3位 通常如果需要乘以或除以2的n次方,都可以用移位的方法代替,大部分的C編譯器,用移位的方法得到程式碼比呼叫乘除法子程式生成的程式碼效率高。
實際上,只要是乘以或除以一個整數才可以用移位的方法得到結果。 如:
a=a*9
分析a*9可以拆分成a*(8+1)即a*8+a*1, 因此可以改為: a=(a<<3)+a
a=a*7
分析a*7可以拆分成a*(8-1)即a*8-a*1, 因此可以改為: a=(a<<3)-a
總結:a=a*n; n分解成(2^m + s),則a=a*n可以改為a=(a<<m)+a*s;a*s再同理分解替換。
例:a=a*10 => a=a*(8+2) => a=a*8 + a*2 => a=(a<<3)+(a<<1)
注:
1.只有整型資料才能用移位替代乘除法,如:char、short、int、long、unsigned char、unsigned short、unsigned int、unsigned long。(double、float、bool、long double則不可以進行移位操作。)
2.有符號資料型別移位需要注意符號位:
對負數進行左移:符號位始終為1,其他位左移。
對正數進行左移:所有位左移,即 <<,可能會變成負數。
對正數進行右移:所有位右移,即 >>
a=a*8;
b=b/8;
可以改為:
a=a<<3;
b=b>>3;
說明:
除2 = 右移1位; 乘2 = 左移1位
除4 = 右移2位; 乘4 = 左移2位
除8 = 右移3位; 乘8 = 左移3位 通常如果需要乘以或除以2的n次方,都可以用移位的方法代替,大部分的C編譯器,用移位的方法得到程式碼比呼叫乘除法子程式生成的程式碼效率高。
實際上,只要是乘以或除以一個整數才可以用移位的方法得到結果。 如:
a=a*9
分析a*9可以拆分成a*(8+1)即a*8+a*1, 因此可以改為: a=(a<<3)+a
a=a*7
分析a*7可以拆分成a*(8-1)即a*8-a*1, 因此可以改為: a=(a<<3)-a