第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

C++求余用的“%”有與它效率相同的其它算法嗎?

C++求余用的“%”有與它效率相同的其它算法嗎?

C++
喵啊喵啊喵 2016-09-09 20:38:50
查看完整描述

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


查看完整回答
1 反對 回復(fù) 2016-09-10
?
Crafon

TA貢獻(xiàn)63條經(jīng)驗 獲得超30個贊

x mod y: while(x >= y) x -= y;
最終x就是要獲得的結(jié)果,適用于x比y很大的時候。如果覺得行希望采納,謝謝!

查看完整回答
反對 回復(fù) 2016-09-09
  • 2 回答
  • 0 關(guān)注
  • 2029 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號