看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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: https://gmplib.org/~tege/divcnst-pldi94.pdf 11/03 13:42
johnjohnlin: 補充一下,編譯器大概是這樣作的 XD 11/03 13:43
x000032001: CPU指令去算除法沒有比較快嗎 11/03 13:51
MOONRAKER: 有硬體optimization幫手 絕對比較快 11/03 19:20
PoorLoser: 11/03 20:15