久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

使用位運算代替乘除法

作者:佚名   來源:本站原創   點擊數:  更新時間:2014年08月16日   【字體:

已知 :

unsigned int temp=1000;
     unsigned int result=0;
要求出result = value * 10%
最直接的方法是     :  result = (temp * 10) / 100;
使用位運算的方法是  result = (temp >> 4) + (temp >> 5) + (temp >> 8) + (temp >> 9);
MPLAB(PICC-V9.70-Lite Mode)下測試得到的結果顯示使用位運算需要的時間僅為乘除法運算的4分之1。
先看測試代碼、比較一下兩種表示方法,再來看如何使用位運算的表示方法。
 
測試代碼 :
#include
__CONFIG(0x3f3a);
unsigned int temp=1000;
unsigned int result1=1;
unsigned int result2=1;
int main(void)
{
    result1 = (temp>>4) + (temp>>5) + (temp>>8) + (temp>>9);  //位運算
    asm("nop");
    asm("nop");
    result2 = ( temp *10 )/100;                             //乘除法
    asm("nop");
    asm("nop");
    while(1) ;
}
MPLAB中沒有更改晶振、的按默認的20MHz調試的。
使用’ asm("nop");’是為了調試的方便。
結果為 :result1 = 97、result2 = 100;
由位運算求出的10%誤差是3%、而乘除法的結果沒有誤差。
在很多情況下都不需要絕對精確的結果、所以上面的差值3是完全可以接受的。
下面來看看使用位運算和乘除法需要的執行時間 :
 
Instruction Cycles
Time(uSecs)
位運算
222
444
乘除法
851
1702
使用位運算需要的時間大概是乘除法運算的4分之1。
在反匯編代碼中可以看到、乘除法運算過程中調用了乘法和除法的函數(MPLAB自帶的) :
乘法 :
0x709處定義的乘法 :
 
除法 :
 
0x734處定義的除法:
 
執行乘發和除法需要的時間為 :
 
Instruction Cycles
Time(uSecs)
__wmul
305
610
__lwdiv
505
1010
執行乘法或除法需要的時間都遠遠比整個位運算多得多。
 
使用這種位運算有幾個限制條件 :
1、需要知道系數、比如上面的10%、當然、這個系數是120%、或是8倍都是一樣的。
2、結果允許一定的誤差、比如上面的97、差值是3。這個誤差可大可小、接下來會講到。
 
現在來看看上面使用的位運算 :
temp10%的表達式
result = (temp >> 4) + (temp >> 5) + (temp >> 8) + (temp >> 9);
是怎么來的呢。
x/64、用移位表示就是x>>6、知道這種表示法、自然就會明白了。
10%用二進制表示出來就是 :
1/(2^4) + 1/(2^5) + 1/(2^8) + 1/(2^9) = 0.099609375、即9.96%、約等于10%。
所以結果就是 :
= temp * (  1/(2^4) + 1/(2^5) + 1/(2^8) + 1/(2^9)  )
= temp / (2^4) + temp / (2^5) + temp / (2^8) + temp / (2^9)
= (temp >> 4) + (temp >> 5) + (temp >> 8) + (temp >> 9)
這里注意要加括號’()’、因為移位運算的優先級比加減法低
10%用到減法來表示的情況 :
(1/(2^3) - 1/(2^5) + 1/(2^7) -1/(2^9)) = 0.099609375
計算時使用天下計算器之類的計算軟件會很快的得到結果 :


誤差 :
方法很簡單、但是要注意誤差的存在。
我們的表達式里面有4個部分1/(2^4) + 1/(2^5) + 1/(2^8) + 1/(2^9)、
如果只要三項1/(2^4) + 1/(2^5) + 1/(2^8)、結果就是0.09765625=9.76%
誤差增大了、要得到越小的誤差、需要的項數就越多。
使用5項時誤差更小1/(2^4) + 1/(2^5) + 1/(2^8) + 1/(2^9) + 1/(2^11)= 0.10009765625=10.00%
但是使用的項數運算量越大,而且移位的位數越大、運算量也越大。
temp>>9需要移位次、temp>>11需要移位10次。
所以只要誤差可接受即可、不必耗費更多的代價來得到更高的精度。
 
空間 :
當然、最好的方法還是將結果做成數組、使用查表取值。
沒有運算、不用考慮耗時、也不用擔心運算出錯。
比如將255分成100份 :
const unsigned char table[100]={
2, 5, 7, 10, 12, 15, 17, 20, 22, 25,    //1%~10%
……
.
……                                    //90%~100%
};
耗費flash中的100Byte并不算多、很多時候flash都用不完的。
 
 
'1/(2^1)=0.5
'1/(2^2)=0.25
'1/(2^3)=0.125
'1/(2^4)=0.0625
'1/(2^5)=0.03125
'1/(2^6)=0.015625
'1/(2^7)=0.0078125
'1/(2^8)=0.00390625
'1/(2^9)=0.001953125
'1/(2^10)=0.0009765625
關閉窗口

相關文章

主站蜘蛛池模板: 二区国产| 91影院在线观看 | 四虎永久在线精品免费一区二 | 国产一级电影在线观看 | 在线视频一区二区三区 | 97色在线视频 | 欧美亚洲另类丝袜综合网动图 | 成人毛片在线观看 | av永久| 亚洲成人观看 | 天天综合久久 | 色综合久 | 中文字幕第十一页 | 亚洲国产欧美在线 | 国产精品久久久久久久7电影 | 国内精品视频一区二区三区 | 天天爽网站 | 久久久久久久久久久久久久av | 成人一区在线观看 | 国产亚洲一区二区在线观看 | 国产在线a| 久久久久亚洲精品 | 美女在线国产 | 欧美成人免费在线 | 在线观看中文字幕av | 国产91视频播放 | 亚洲狠狠 | 欧美在线国产精品 | 亚洲高清免费视频 | 亚洲另类视频 | 国产一区欧美一区 | 狠狠综合久久av一区二区老牛 | 久久亚洲一区 | 国产1页 | 国产区在线看 | 日韩电影一区 | 作爱视频免费观看 | 欧美精品久久久久久久久久 | 亚洲天堂二区 | 色综合视频 | 中文字幕在线免费观看 |