2016-07-11 52 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更不合逻辑且难以阅读。

相关问题