> 2 ; 通常如果需要乘以或除以2的n次方,都可以用移位的方法代替。用移位的方法得到代碼比調用乘除法子程序生成的代碼效率高。實際上,只要是乘以或除以一個整數,均可以想辦法用移位的方法得到結果,如: a =a* 9 可以改為: a =(a 3 )+a 采用運算量更小的表達式替換原來的表達式,下面是一個經典例子: 原代碼: x = w % 8; y = pow(x, 2.0); z = y * 33; for (i = 0;i { h = 14 * i; printf("%d", h); } 修改為" />

吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

C語言如何用移位來解決乘除法問題

麥辣雞腿堡 ? 來源:軒哥談芯 ? 作者:Debug ? 2023-11-21 11:25 ? 次閱讀

用移位來解決乘除法問題

a=a*4;
b=b/4;

可以改為:

a=a< 2;
b=b >>2;

通常如果需要乘以或除以2的n次方,都可以用移位的方法代替。用移位的方法得到代碼比調用乘除法子程序生成的代碼效率高。實際上,只要是乘以或除以一個整數,均可以想辦法用移位的方法得到結果,如:

a=a*9

可以改為:

a=(a< 3)+a

采用運算量更小的表達式替換原來的表達式,下面是一個經典例子:

原代碼:

x = w % 8;
y = pow(x, 2.0);
z = y * 33;
for (i = 0;i < MAX;i++)
{
    h = 14 * i;
    printf("%d", h);
}

修改為:

x = w & 7;                 /* 位操作比求余運算快*/
y = x * x;                 /* 乘法比平方運算快*/
z = (y < < 5) + y;          /* 位移乘法比乘法快 */
for (i = h = 0; i < MAX; i++)
{
    h += 14;               /* 加法比乘法快 */
    printf("%d",h);
}

如此,對比一下執行時間會快很多。

學會避免不必要的整數除法

整數除法是整數運算中最慢的,所以應該盡可能避免。一種可能減少整數除法的地方是連除,這里除法可以由乘法代替。這個替換的副作用是有可能在算乘積時會溢出或者丟失精度,所以只能在一定范圍的除法中使用。

舉個例子,不好的代碼:

int i, j, k, m;
m = i / j / k;

推薦的代碼: 注意精度

int i, j, k, m;
m = i / (j * k);
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C語言
    +關注

    關注

    180

    文章

    7614

    瀏覽量

    137736
  • 代碼
    +關注

    關注

    30

    文章

    4828

    瀏覽量

    69059
收藏 人收藏

    評論

    相關推薦

    乘除法運算

    乘除法運算本應用例的目的在于提供乘、除運算的函數及介紹乘除運算在SPMC75F2413A中的使用。應用例提供有符號和無符號數的乘除,其中包括32-Bit/16-Bit、16-Bit/8-Bit
    發表于 09-21 09:26

    單片機C語言易錯知識點,記住它們會讓你事半功倍

    是個不錯的方法,筆者很喜歡拿到一段代碼后用移位代替乘除法進行優化。不過有時候卻會出現問題,比如溢出問題。當很明顯可能溢出的話我們是會注意的,比如但是有時候這個問題是不明顯的,比如當移位
    發表于 08-23 16:36

    C語言編程容易混淆的幾個問題總結

    會出錯3. 移位要防止溢出其實用移位代替乘除法是個不錯的方法,筆者很喜歡拿到一段代碼后用移位代替乘除法
    發表于 09-18 16:17

    單片機C語言易錯

    、 !和 ~ 不一樣! 是邏輯非符號,~ 是位取反符號。對IO口某個引腳賦值時不要錯用 !如 2、的優先級低于+、-比如要實現c=x*2+1,沒有加括號會出錯 3、移位要防止溢出其實用移位代替
    發表于 11-15 11:41

    C語言編程容易混淆的幾個問題總結

    加括號會出錯3. 移位要防止溢出其實用移位代替乘除法是個不錯的方法,筆者很喜歡拿到一段代碼后用移位代替乘除法
    發表于 08-23 17:24

    請問單片機C語言容易出錯是為什么?怎么解決?

    加括號會出錯3移位要防止溢出其實用移位代替乘除法是個不錯的方法,筆者很喜歡拿到一段代碼后用移位代替乘除法
    發表于 06-07 05:33

    淺析嵌入式C語言里的除法移位

    簡單給大家分析一下嵌入式C語言編程時用到的除法移位。  除法土豪  除法在嵌入式微處理器里可算
    發表于 04-30 00:31

    請問一下C語言如何通過移位實現算術乘除

    請問一下C語言如何通過移位實現算術乘除
    發表于 10-19 06:48

    整數乘除法與位運算的效率對比分析哪個好

    文章目錄01 - 為什么整數位移比乘除法高效02 - 位移和乘除法對比2.1 - 匯編代碼對比2.2 - 編寫復雜度對比2.3 - 速度對比03 - 例程3.1 - 例程1,單片機時鐘重載值3.1
    發表于 12-24 07:33

    RISC有沒有乘除法指令呢?

    RISC有沒有乘除法指令呢?
    發表于 02-27 13:59

    乘除法電路

    乘除法電路 圖5.4-21是乘除法運算實用電路之一。 1、A
    發表于 04-26 16:11 ?1.7w次閱讀
    <b class='flag-5'>乘除法</b>電路

    按鍵移位程序【C語言版】

    按鍵移位程序【C語言版】按鍵移位程序【C語言版】按鍵移位
    發表于 12-29 11:04 ?0次下載

    關于如何提高C語言程序的執行效率

    乘除法很消耗CPU資源,查看匯編代碼會發現,一個乘除法運算會編譯出10幾甚至幾10行代碼。如果是乘以或除以2的n次方,可以用>實現,這種移位運算在編譯時就已經算好了,所以代碼很簡潔,
    的頭像 發表于 06-26 16:36 ?7640次閱讀

    匯編實現多字節乘除法

    匯編實現多字節乘除法乘法單片機的乘法本質是二進制的乘法,而乘法本身是通過加法實現的。多字節的乘法其實就是移位做加法。例如7x11,用二進制豎式表示如下圖:可以看到,其實就是判斷乘數的每一位是1還是0
    發表于 11-15 17:21 ?21次下載
    匯編實現多字節<b class='flag-5'>乘除法</b>

    verilog移位操作和C語言移位操作的異同點有哪些?

    C語言移位操作和Verilog語言移位操作在某些方面具有相似之處,但也存在一些顯著的不同點。下面我們將通過代碼示例
    的頭像 發表于 08-28 09:43 ?929次閱讀
    舒兰市| 百家乐官网教父方法| 罗盘24层| 来博百家乐官网游戏| 澳门百家乐路单| 博彩e族字谜专区| 百家乐牌机的破解法| 至尊百家乐| 百家乐娱乐网网77scs| 百家乐官网打劫法| 葡京线上娱乐| 大发888娱乐城注册lm0| 澳门赌场着装| 游艇会百家乐的玩法技巧和规则| 做生意招牌什么颜色旺财| 百家乐官网和的几率| 平湖市| tt娱乐城备用网址| 缅甸百家乐网站是多少| 大家旺百家乐官网的玩法技巧和规则| 百家乐官网微笑心法搜索| 利来网| 大发888游戏平台hg| 不夜城百家乐的玩法技巧和规则| 百家乐博彩策略论坛| 在线百家乐官网大家赢| 星期八娱乐城官网| 十大博彩网| 德州扑克大赛视频| 大发888赢钱技巧| 威尼斯人娱乐城 线路畅通中心| 百家乐网上娱乐场开户注册| 百家乐棋牌游戏皇冠网| 百家乐视频二人麻将| 百家乐洗码全讯网| 网上百家乐优博| 斗六市| 乌兰察布市| 百家乐官网机器二手| 百家乐官网斗视频游戏| 保单百家乐官网路单|