2016-07-11 88 views
0

我正在查看一個CodeWars問題(IQ Test)的解決方案,其中給出了一串數字以及除1之外的所有數字是偶數還是奇數。您需要返回索引加上與其餘數字不一樣的數字位置的1。&1 JavaScript。它是如何工作的?聰明還是好?

我對下面發佈的解決方案中說& 1的行感到困惑。該代碼不起作用w/& &或w/& 1帶走。

function iqTest(numbers){ 
    numbers = numbers.split(' ') 

    var evens = [] 
    var odds = [] 

    for (var i = 0; i < numbers.length; i++) { 
    if (numbers[i] & 1) { //PLEASE EXPLAIN THIS LINE! 
     odds.push(i + 1) 
    } else { 
     evens.push(i + 1) 
    } 
    } 

    return evens.length === 1 ? evens[0] : odds[0] 
} 

此外,您會考慮使用& 1是最好的做法還是僅僅是「聰明」的代碼?

回答

1

二進制數字是01並且它們中的每一個都被稱爲位。

單個&是加法運算,它按位運算。

1 = 01 
2 = 10 
3 = 11 
4 = 100 

可以看出,奇數的每一點是1和偶數爲0

在添加操作

0 & 0 = 0 
0 & 1 = 0 
1 & 0 = 0 
1 & 1 = 1 

因此,只有奇數將返回1和偶數將返回0和編程僅0考慮falsy

如果我們想檢查5是一個奇數或偶數

5 = 101 

,並執行和(&)與1

101 
& 001 
----- 
    001 

和的二進制001值操作處於10基數

1

因此,它會執行簡單的奇偶過程。

2

單個&'bitwise' operator。這個特定的運算符(&)是按位AND運算符 - 它在每個位的位置都返回一個,這兩個操作數的相應位都是1。

這裏使用的方式是測試numbers[i]是偶數還是奇數。如i0numbers.length的循環,對於第一次迭代,if語句評估爲0 & 1,其評估爲0false。在循環的下一次迭代中,該語句將爲1 & 1,其計算結果爲1true

結果 - 當numbers[i] & 1計算結果爲0,或false,然後numbers[i]被推向odd陣列。如果numbers[i] & 1評估爲1true,則將numbers[i]推送到even陣列。

&運營商測試偶數和奇數的替代方法是使用modulo operatornumbers[i] % 2產生相同的輸出。也就是說,1 % 2的結果是1true,就像任何奇數一樣,因爲奇數除以2導致餘數爲1.並且任何偶數如2 % 2導致0false,因爲偶數除以2的結果在餘數爲0.

至於你的第二個問題,它是「聰明的還是好的?」。這絕對是聰明的。這是否好取決於你問誰,你的目標是什麼。許多人會說,它比使用num % 2更不合邏輯且難以閱讀。

相關問題