2 回答
已采納

蕭雁翎
TA貢獻(xiàn)57條經(jīng)驗 獲得超235個贊
如果右側(cè)為常數(shù),可轉(zhuǎn)換成乘法、右移和減法?,F(xiàn)代的編譯器都會做這個優(yōu)化,例如
//?mod.c unsigned?a?=?123; int?main()?{?return?a?%?13;?}
使用 clang -c -S mod.c 輸出匯編
???movl????$13,?%eax ????movl????$0,?-4(%rbp) ????movl????_a(%rip),?%ecx ????movl????%eax,?-8(%rbp)??????????##?4-byte?Spill ????movl????%ecx,?%eax ????xorl????%edx,?%edx ????movl????-8(%rbp),?%ecx??????????##?4-byte?Reload ????divl????%ecx ????movl????%edx,?%eax
這是直接翻譯,用 divl 做除數(shù),這指令同時能獲得余數(shù)(edx ),但 divl 是很慢的。
然而,使用優(yōu)化的話 clang -c -S -O3 mod.c
???movl????_a(%rip),?%eax ????imulq???$1321528399,?%rax,?%rcx?##?imm?=?0x4EC4EC4F ????shrq????$34,?%rcx ????imull???$13,?%ecx,?%ecx ????subl????%ecx,?%eax
解釋一下,因為 1321528399 / 2^34 ≈ 1 / 13
?a?%?13 =?a?-?(a?/?13)?*?13 =?a?-?uint32_t((uint64_t(a)?*?1321528399ULL)?>>?34)?*?13

Crafon
TA貢獻(xiàn)63條經(jīng)驗 獲得超30個贊
x mod y: while(x >= y) x -= y;
最終x就是要獲得的結(jié)果,適用于x比y很大的時候。如果覺得行希望采納,謝謝!
- 2 回答
- 0 關(guān)注
- 2029 瀏覽
添加回答
舉報
0/150
提交
取消