、(high + low) >>> 1
は非負数の正確な平均を実行するために使用されていない符号ビットを使用するトリックです。 high
とlow
は両方非負であるという仮定の下で
、我々は最上位ビット(符号ビット)がゼロであることを確実に知ります。
したがって、high
とlow
は実際には31ビットの整数です。
high = 0100 0000 0000 0000 0000 0000 0000 0000 = 1073741824
low = 0100 0000 0000 0000 0000 0000 0000 0000 = 1073741824
これらを一緒に追加すると、トップビットに「スピル」する可能性があります。符号付き32ビット整数として
high + low = 1000 0000 0000 0000 0000 0000 0000 0000
= 2147483648 as unsigned 32-bit integer
= -2147483648 as signed 32-bit integer
(high + low)/2 = 1100 0000 0000 0000 0000 0000 0000 0000 = -1073741824
(high + low) >>> 1 = 0100 0000 0000 0000 0000 0000 0000 0000 = 1073741824
ことによってそれを分割することであるので、我々は(符号なし整数として)2で割るする必要が最善のことは、論理右シフト>>>
です。
符号なし整数(CやC++など)の言語では、入力が完全な32ビット整数になる可能性があるため、扱いにくくなります。一つの解決策は次のとおりです。low + ((high - low)/2)
最後に>>>
、>>
、と/
の違いを列挙する:
>>>
は論理右シフトです。それは、上位ビットをゼロで満たす。
>>
は、算術右シフトです。それは元のトップビットのコピーで上部を埋めます。
/
は部門です。数学的
:
x >>> 1
- 扱い符号なし整数として
x
及び2でそれを分割します。それは丸められます。
x >> 1
は符号付き整数としてx
を扱い、2で除算します。負の無限大に向かって丸くなります。
x/2
は符号付き整数としてx
を扱い、2で除算します。それはゼロに向かってラウンドします。
[バイナリ検索のバグ](http://googleresearch.blogspot.com/2006/06/extra-extra-read-all-about-it-nearly.html)を参照しているとします。 ? – Mehrdad
オーバーフローの問題をどのように修正したのですか?また、どのようなオーバーフローの問題? –
Joshua Blochが私に語った:http://googleresearch.blogspot.com/2006/06/extra-extra-read-all-about-it-nearly.html – JohnPristine