2013-12-08 73 views
1

在採訪中我給出了這個問題來描述評論中的輸出。由3分部運營商劃分的分部

unsigned int d2(unsigned int a) 
{ 
__int64 q = (__int64)a * 0x0AAAAAAAB; // (2^33+1)/3 
return (unsigned int)(q >> 33); 
} 

我已經檢查了其他問題在Stackoverflow相關除3但沒有看起來這麼快,很小。 任何人都可以幫助我解釋函數如何給輸出寫入註釋嗎?

+0

必須與溢出有關。 –

+1

這是一個二進制等值的數字,乘以100000/3約爲33333,然後除以100000,使其大約等於原始數字除以3. – Max

+2

奇怪的問題採訪:) –

回答

10

功能由3

如果除以2^33相乘,然後除以2^33劃分(由右移位),則獲得原始數除以一個32位無符號數。但如果你乘以(2^33)/ 3,然後除以2^33,那麼你實際上除以三。

最後一位數字是B而不是A導致結果向上舍入。

沒有必要在代碼中實際編寫它,因爲編譯器通常會爲您執行此操作。 Try it and see.(此外,對於有符號輸入,編譯器可以安全地生成帶符號右移,但C語言不定義這種操作。)

+0

q >> 33除以2^33,但是如何使用0x0AAAAAAAB是2^33/3? –

+0

@Learner這就是它......它只是一個數字。它從確切的分數上舍入。 – Potatoswatter

+0

必須有號碼出現的方式。你能否詳細說明一下? –