1. 程式人生 > >C語言中乘除法與移位關係

C語言中乘除法與移位關係

微控制器程式設計中移位運算比乘除法效率更高,當然用移位運算替代乘除法程式碼會有點晦澀。下面記錄下自己學習的內容以做備忘。 用移位實現乘除法運算 
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,其他位左移。 對正數進行左移:所有位左移,即 <<,可能會變成負數。 對正數進行右移:所有位右移,即 >>