作者KILLE (啃)
看板C_and_CPP
標題Re: [問題] bit_operation除非2的冪次方
時間Mon Nov 3 02:06:42 2014
※ 引述《kdok123 (小天)》之銘言:
: 標題: [問題] bit_operation除非2的冪次方
: 時間: Sun Nov 2 18:13:44 2014
:
: ex: 除3
:
: 如何用bit operation實現呢?
:
: 我想了半天沒有想出來...
:
: 希望各位可以指點我一下
:
: 謝謝
:
: --
: ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.112.25.105
: ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1414923227.A.9BC.html
: 推 LPH66: 沒有, 不過倒是有反乘的做法 (雖然這會依賴 overflow 結果) 11/02 18:16
: → LPH66: 所以你就乖乖寫 /3 就好, 剩下的編譯器會幫你做 11/02 18:17
編譯器作法大體是這樣搞:
X/3 = (X*(a/3) )*(1/a)
a = 2的n次方,所以 1/a 只要變成右平移n位即可
( n的值依編譯器不同 微軟是31到33)
而 a/3 編譯器可以先算好 變成一個常數
簡單講 把乘法變成一個平移再一個乘法
那為何編譯器會想避乘法
這樣想一下 國小學的直式計算:
直式乘法 是可以一人做一位再加總的
而直式除法 似乎很難想到分開幹的辦法
這就是為何 要避開除法的原因
因為除法不能靠人(加法器)多好辦事加速
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.249.89.36
※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1414951605.A.3D8.html
→ johnjohnlin: 補充一下,編譯器大概是這樣作的 XD 11/03 13:43
→ x000032001: CPU指令去算除法沒有比較快嗎 11/03 13:51
→ MOONRAKER: 有硬體optimization幫手 絕對比較快 11/03 19:20
推 PoorLoser: 11/03 20:15