2011-09-17 1906 views
3

我正在閱讀underscore.js代碼。我發現這個:「>> 1」是什麼意思?

var mid = (low + high) >> 1; 

>> 1是做什麼的?爲什麼它有用?

+0

作者可能認爲'>> 1'會比'/ 2'效率更高。在大多數語言中,這是不正確的;例如,C編譯器可能會爲這兩者生成相同的代碼。我不知道這是否適用於JavaScript。 –

+0

@Keith:JavaScript會切換到分區的浮點值,所以使用shift可以將所有內容保存在整數區域中,而無需使用'Math.floor'。 –

回答

7

它將左側的位向右移一位。這相當於除以2.

在'古代的時代'中,這比簡單的劃分要快,儘管我懷疑它會在下劃線的情況下產生很大的變化。

+0

downvote的原因? –

+0

嚴格來說,它等於*整數除法* 2,向負無窮大舍入。 (我不是downvoter。) –

+0

嚴格來說,2是一個整數:),但指向 –

1

這是一個按位右移。對於整數,相當於除以二;對於JavaScript數字,它與Math.floor((low + high)/2)大致相同,但完全避免了浮點數。

+0

謝謝。更隱晦的版本比你更高效? – Randomblue

+0

@Randomblue:是的,這個轉換應該更快,因爲一切都應該以整數完成,並且避免了'Math.floor'函數調用。我不知道這個差異是否與體面的JavaScript實現有很大關係。 –

0

它可能在那裏保持整數值。在這裏除以2可能會在某些情況下將結果轉換爲浮點數,例如,如果(low + high)是奇數。

這兩種操作並非完全等同:

> (5+2)/2 
3.5 
> (5+2)>>1 
3 

對於這個特殊的用途,不過,也有better idioms尋找兩個數字的中點。

1

>>是傳播右移運算符的符號。它將(low + high)的位模式右移1,最左邊的位被複制到左邊。它實際上與Math.floor((low + high)/2)相同。

如果我沒有指出使用(low + high) >> 1來計算二進制搜索中可能導致溢出的數組中點的細微錯誤,那我就會失職。 (low + high) >>> 1其中>>>是零填充右移運算符,沒有溢出錯誤。

+0

謝謝。我在哪裏可以找到關於這個溢出錯誤的更多信息? – Randomblue

+0

https://developer.mozilla.org/en/JavaScript/Reference/Operators/Bitwise_Operators#Bitwise_shift_operators是一個很好的資源。 –

+0

您可以在這裏閱讀http://googleresearch.blogspot.com/2006/06/extra-extra-read-all-about-it-nearly.html上的溢出錯誤。這是多年來JDK中的一個錯誤。這同樣適用於JavaScript中的按位操作,因爲它們具有相同的語義。 –