2016-07-11 5 views
0

私はCodeWars問題(IQ Test)の解決策を探しています。この問題では、数字列とすべての数字が与えられていますが、1は偶数または奇数です。残りの数字とは異なる数字の位置のインデックスに1を加えたものを返す必要があります。&1 JavaScript。どのように機能するのですか?賢いか良い?

下記に掲載されている解決策で&という1行目が混乱しています。コードは、& &または&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

2進数は0とであり、それぞれをビットと呼びます。

シングル&はビット演算で加算演算です。

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

のようにあなたは奇数のすべての最後のビットが 1で、偶数 0であることがわかります。追加操作で

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

だから、唯一の奇数は1を返し、偶数は0を返し、プログラミングでのみ0falsyを考えます。

我々は5を確認するたい場合1

101 
& 001 
----- 
    001 

と奇数または偶数

5 = 101 

及び実行し(&)操作であり、バイナリ001の値は110における塩基番号

それで、それは簡単な偶数のプロセスを実行します。

2

シングル&'bitwise' operatorです。この特定の演算子(&)は、ビット単位のAND演算子で、各ビット位置に1を返します。各ビット位置には、両方のオペランドの対応するビットが1になります。

ここで使用されている方法は、numbers[i]が偶数か奇数かどうかをテストすることです。 0からnumbers.lengthまでのiループとして、ifステートメントは0 & 1と評価され、0またはfalseと評価されます。ループの次の反復では、文は1 & 1となり、これは1またはtrueと評価されます。

結果 - numbers[i] & 10、またはfalseと評価された場合、その後numbers[i]oddアレイにプッシュされます。numbers[i] & 11またはtrueと評価される場合、numbers[i]evenアレイにプッシュされます。

&オペレータが偶数と奇数をテストする代わりに、modulo operatorを使用することもできます。 numbers[i] % 2は同じ出力になります。つまり、1 % 2の結果は1またはtrueとなり、奇数を2で割った値が1になるため、2 % 2の結果は0またはfalseとなり、偶数を2で割った値になりますあなたの2番目の質問については、それは「賢いのか良い?」と。それは間違いなく賢いです。それが良いかどうかは、あなたが誰に尋ねるのか、あなたの目標が何であるのかによって異なります。多くの人は、num % 2を使用するより論理的で読みにくいと言います。

関連する問題