在採訪中我給出了這個問題來描述評論中的輸出。由3分部運營商劃分的分部
unsigned int d2(unsigned int a)
{
__int64 q = (__int64)a * 0x0AAAAAAAB; // (2^33+1)/3
return (unsigned int)(q >> 33);
}
我已經檢查了其他問題在Stackoverflow相關除3但沒有看起來這麼快,很小。 任何人都可以幫助我解釋函數如何給輸出寫入註釋嗎?
在採訪中我給出了這個問題來描述評論中的輸出。由3分部運營商劃分的分部
unsigned int d2(unsigned int a)
{
__int64 q = (__int64)a * 0x0AAAAAAAB; // (2^33+1)/3
return (unsigned int)(q >> 33);
}
我已經檢查了其他問題在Stackoverflow相關除3但沒有看起來這麼快,很小。 任何人都可以幫助我解釋函數如何給輸出寫入註釋嗎?
功能由3
如果除以2^33相乘,然後除以2^33劃分(由右移位),則獲得原始數除以一個32位無符號數。但如果你乘以(2^33)/ 3,然後除以2^33,那麼你實際上除以三。
最後一位數字是B
而不是A
導致結果向上舍入。
沒有必要在代碼中實際編寫它,因爲編譯器通常會爲您執行此操作。 Try it and see.(此外,對於有符號輸入,編譯器可以安全地生成帶符號右移,但C語言不定義這種操作。)
q >> 33除以2^33,但是如何使用0x0AAAAAAAB是2^33/3? –
@Learner這就是它......它只是一個數字。它從確切的分數上舍入。 – Potatoswatter
必須有號碼出現的方式。你能否詳細說明一下? –
必須與溢出有關。 –
這是一個二進制等值的數字,乘以100000/3約爲33333,然後除以100000,使其大約等於原始數字除以3. – Max
奇怪的問題採訪:) –