回答
它將左側的位向右移一位。這相當於除以2.
在'古代的時代'中,這比簡單的劃分要快,儘管我懷疑它會在下劃線的情況下產生很大的變化。
downvote的原因? –
嚴格來說,它等於*整數除法* 2,向負無窮大舍入。 (我不是downvoter。) –
嚴格來說,2是一個整數:),但指向 –
這是一個按位右移。對於整數,相當於除以二;對於JavaScript數字,它與Math.floor((low + high)/2)
大致相同,但完全避免了浮點數。
謝謝。更隱晦的版本比你更高效? – Randomblue
@Randomblue:是的,這個轉換應該更快,因爲一切都應該以整數完成,並且避免了'Math.floor'函數調用。我不知道這個差異是否與體面的JavaScript實現有很大關係。 –
它可能在那裏保持整數值。在這裏除以2可能會在某些情況下將結果轉換爲浮點數,例如,如果(low + high)
是奇數。
這兩種操作並非完全等同:
> (5+2)/2
3.5
> (5+2)>>1
3
對於這個特殊的用途,不過,也有better idioms尋找兩個數字的中點。
>>
是傳播右移運算符的符號。它將(low + high)
的位模式右移1
,最左邊的位被複制到左邊。它實際上與Math.floor((low + high)/2)
相同。
如果我沒有指出使用(low + high) >> 1
來計算二進制搜索中可能導致溢出的數組中點的細微錯誤,那我就會失職。 (low + high) >>> 1
其中>>>
是零填充右移運算符,沒有溢出錯誤。
謝謝。我在哪裏可以找到關於這個溢出錯誤的更多信息? – Randomblue
https://developer.mozilla.org/en/JavaScript/Reference/Operators/Bitwise_Operators#Bitwise_shift_operators是一個很好的資源。 –
您可以在這裏閱讀http://googleresearch.blogspot.com/2006/06/extra-extra-read-all-about-it-nearly.html上的溢出錯誤。這是多年來JDK中的一個錯誤。這同樣適用於JavaScript中的按位操作,因爲它們具有相同的語義。 –
- 1. >> =是什麼意思?
- 2. 這裏「2>&1」是什麼意思?
- 3. Laravel:take(1) - > count();這是什麼意思?
- 4. Groovy,什麼意思 - >意思是
- 5. `^^^`和`〜>`是什麼意思?
- 6. 「 - >」是什麼意思?
- 7. <>是什麼意思?
- 8. <>是什麼意思?
- 9. 「=>」是什麼意思?
- 10. '=>'是什麼意思?
- 11. `()=> Unit`是什麼意思?
- 12. > var是什麼意思?
- 13. 「 - >」是什麼意思?
- 14. 「=>」是什麼意思?
- 15. <+>是什麼意思?
- 16. 「outer =>」是什麼意思?
- 17. {< >}是什麼意思?
- 18. $ this->是什麼意思?
- 19. a >> = b是什麼意思?
- 20. > +和> - 是什麼意思在C#
- 21. >>和0xfffffff8是什麼意思?
- 22. >> = purescript中的意思是什麼?
- 23. class-> methode1() - > methode2()是什麼意思?
- 24. 「somevar >> 0」是什麼意思?
- 25. 這是什麼意思? >> ActionController :: InvalidAuthenticityToken
- 26. 什麼是(int - > int) - >(int - > int)是什麼意思?
- 27. 什麼是()=> {}是什麼意思?
- 28. >/dev/null 2>&1是什麼意思?
- 29. reinterpret_cast <char *>(&st)和(-1)* static_cast <int>是什麼意思?
- 30. 在shell腳本中,> 1 ../log/ orientdb.log和1 >> ../ log/orientdb.log是什麼意思?
作者可能認爲'>> 1'會比'/ 2'效率更高。在大多數語言中,這是不正確的;例如,C編譯器可能會爲這兩者生成相同的代碼。我不知道這是否適用於JavaScript。 –
@Keith:JavaScript會切換到分區的浮點值,所以使用shift可以將所有內容保存在整數區域中,而無需使用'Math.floor'。 –