0

私は私の質問ここに提案されたビット演算子を試してみました。

私のテストスイートの結果を確認してください:

function equal(n1,n2){
    var bool = (n1^n2 >= 0)?true:false;
    document.write("<div>"+bool+" ("+(n1^n2)+")</div>");
}


equal(-5,-2);  //true
equal(-4,-20); //true
equal(15,-2);  //false
equal(25,3);   //true 

equal(-1,1);   //false
equal(1,1);    //true
equal(-1,-1);  //true

// edgecases
equal(0,0);
equal(-0,0);
equal(+0,0);
equal(-0,+0);
equal(+0,-0);

結果:

true (5)
true (16)
true (-15)
true (26)

true (-2)
false (0)
true (0)

true (0)
true (0)
true (0)
true (0)
true (0)

私のそれに応じたフィドルはここにあります。

結果は私を非常に混乱させます。私もバカですか?ここで何が起こったのですか?

4

1 に答える 1

1

かっこが間違った場所にありました:

function equal(n1, n2){
    var bool = (n1 ^ n2) >= 0 ? true : false;
    document.write("<div>" + bool + " (" + (n1^n2) + ")</div>");
}

これは、期待どおりの結果が得られた更新されたフィドルです。

この場合、すべてのビット演算子は関係比較演算子よりも優先順位が低いため、これは重要です。また、条件演算子(?:)はすべてのビット演算子よりも優先順位が低いため、条件全体を括弧で囲む必要はありません。

于 2012-04-24T15:07:49.713 に答える