10

次の条件を考慮してください。

(true & true & false & false & true) == true //returns: false

ご覧のとおり、ビットごとの AND の動作は論理 AND とまったく同じです。

(true && true && false && false && true) == true //returns: false

ビット単位の操作が論理操作と同じであるのに、なぜ論理操作を使用する必要があるのか​​ 疑問に思っています。

: Mozilla Firefox ではかなり高速であるため、パフォーマンスの問題が原因であると答えないでください。この jsPerf を参照してください: http://jsperf.com/bitwise-logical-and

4

11 に答える 11

22

論理演算子を使用した短絡評価の最も一般的な用途は、パフォーマンスではなく、エラーの回避です。これを参照してください:

if (a && a.length)

ここだけでは使えません&

&ブール値を扱わない場合は、代わりに使用&&できないことに注意してください。たとえば&2(01バイナリで) と4(10バイナリで) は0です。

ifまた、テストとは別に、 &&(のように||) も使用されることに注意してください。これは、オペランドの 1 つを返すためです。

"a" & "b" => 0
"a" && "b" => "b"

より一般的には、多くの場合&、代わりに使用&&できます。;JavaScriptコードでほとんどを省略するのと同じです。しかし、必要以上に考える必要があります (または、時々奇妙なバグが発生します)。

于 2013-02-14T09:02:03.203 に答える
13

ビット演算の動作は同じですか?

いいえ、ちがいます。ビット単位の演算子は整数で機能しますが、論理演算子のセマンティクスは大きく異なります。純粋なブール値を使用する場合にのみ、結果が類似する場合があります。

  • ビット演算子: 両方のオペランドを評価し、32 ビット整数に変換して演算し、数値を返します。
  • 論理演算子: 最初のオペランドを評価し、真/偽の場合は評価して 2 番目のオペランドを返し、それ以外の場合は最初の結果を返します。これは短絡評価と呼ばれます

この違いは、結果の型ですでに確認できます。

(true & true & false & false & true) === 0
(true && true && false && false && true) === false
于 2013-02-14T09:04:49.837 に答える
3

異なる意図を使用&&または&伝達するためです。

最初のものは、真実性をテストしていると言っています。

2 つ目は、ちょっとした魔法を思いつくことを意味します。実際のコードでは、variable1 & variable2. あなたが実際に真実(真実性ではない)をテストするつもりであるかどうかは明らかではありません。が使用された理由が明らかでないため、コードの読者はおそらく混乱するでしょう。&

さらに、他の多くの投稿で指摘されているように、ブール値や関数呼び出し以外の値を考慮すると、セマンティクスは完全に異なります。

于 2013-02-14T09:04:55.703 に答える
3

ほとんどすべてがすでに述べられていますが、完全を期すために、パフォーマンスの側面を見てみたいと思います(あなたが言ったことは問題ではありませんが、それは非常にうまくいくかもしれません):

JavaScript には、式の評価方法に関する覚えにくい規則がたくさんあります。これには、より複雑な比較になると、多くの型キャスト (暗黙的な型強制) が含まれます。配列とオブジェクトは、メソッドを呼び出して変換する必要がありtoString()、その後数値にキャストされます。これにより、パフォーマンスが大幅に低下します。

論理演算子&&が短絡しています。これは、の値に遭遇するとすぐに評価が停止し、返されることを意味しfalseます。ビットごとの演算子は、常にステートメント全体を評価します。

非常に高価な操作 (配列とオブジェクトのキャスト) が含まれる場合の次の (はい、非常に極端な) 短絡の例を考えてみましょう: ( https://jsbench.me in Chromium 90 によるパフォーマンス)

// logical operator
( false && {} && [] ) == true
//  /\ short circuits here
// performance: 805M ops/sec  

// bitwise operator
( false  & {}  & [] ) == true // evaluates the entire statement
// performance: 3.7M ops/sec

パフォーマンスが 100 倍異なることがわかります。

于 2013-02-14T09:30:56.500 に答える
1

大きな違いがあります: 論理演算はショートサーキットです。(true && true && false ) が最後に実行されることを意味します。これにより、以下を使用した抽象ファクトリ モデルなどの強力な構成が可能になります。var myFunc = mozilla.func || opera.sameFunc || webkit.evenOneMoreVariationOfTheSameConcept;

ビット演算のすべての部分式は完全に評価する必要があります-そしてところで。いずれにせよ、定数のビット単位または論理式を評価する必要があることはめったにありません。

于 2013-02-14T09:04:31.640 に答える
1

最初の条件は、最初に変換し、次にビットを合計する必要があります。しかし、2番目は論理値と戻り値をチェックします。

したがって、最初のものは2番目のものより遅くなります。

このテストを実行: http://jsperf.com/bitwise-logical

Chrome と IE では Bitwise の方が遅いが、FireFox では論理の方が遅い

于 2013-02-14T09:06:52.637 に答える
1

ビットごとの演算子を短絡することはできません。また、ビット単位の演算子は、ブール式を計算するだけでなく、さらに多くのことを行うことができます。

于 2013-02-14T09:03:14.970 に答える
-1
var bit1 = (((true & true) & (false & false)) & true), // return 0;
    bit2 = (((true && true) && (false && false)) && true); // return flase

alert(bit1 + ' is not ' + bit2);
于 2013-02-14T12:15:51.190 に答える