web-dev-qa-db-ja.com

演算子| =はJavaScriptで何をしますか?

JSプロジェクトで次のコードを見つけました。

var a = new Array();
a[0] = 0;
for (var b = 0; b < 10; b++) {
  a[0] |= b; 
}

Forループの本体で|=は何をしますか?

コード例は疑わしいですが、パフォーマンスの向上の例として、V8によって ここ が提示されています。

更新された例

上記の例は、ほとんどの目的と目的でvar a = [15];と同等です。 |=演算子のより現実的な例は、単一の変数、たとえばアクセス許可オブジェクトにバイナリフラグを設定することです。

//Set up permission masks
var PERMISSION_1_MASK = parseInt('0001',2);
var PERMISSION_2_MASK = parseInt('0010',2);
..

//Set up permissions
userPermissions = 0;
userPermissions |= hasPermissionOne && PERMISSION_1_MASK;
userPermissions |= hasPermissionTwo && PERMISSION_2_MASK;
..

//Use permissions
if(userPermissions & PERMISSION_1_MASK){
    ..//Do stuff only allowed by permission 1
}
44
a[0] |= b

基本的には

a[0] = a[0] | b

「|」 またはビット演算子

Updatea[0]0に割り当てられている場合、バイナリのa[0]0000です。ループの中、

  1. b = 0

    a[0] = 0 (base 10) = 0000 (base 2)
    b    = 0 (base 10) = 0000 (base 2)
                       ---------------
    a[0] | b           = 0000 (base 2) = 0 (base 10)
    
  2. b = 1

    a[0] = 0 (base 10) = 0000 (base 2)
    b    = 1 (base 10) = 0001 (base 2)
                       ---------------
    a[0] | b           = 0001 (base 2) = 1 (base 10)
    
  3. b = 2

    a[0] = 1 (base 10) = 0001 (base 2)
    b    = 2 (base 10) = 0010 (base 2)
                       ---------------
    a[0] | b           = 0011 (base 2) = 3 (base 10)
    
  4. b = 3

    a[0] = 3 (base 10) = 0011 (base 2)
    b    = 3 (base 10) = 0011 (base 2)
                       ---------------
    a[0] | b           = 0011 (base 2) = 3 (base 10)
    
  5. b = 4

    a[0] = 3 (base 10) = 0011 (base 2)
    b    = 4 (base 10) = 0100 (base 2)
                       ---------------
    a[0] | b           = 0111 (base 2) = 7 (base 10)
    
  6. b = 5

    a[0] = 7 (base 10) = 0111 (base 2)
    b    = 5 (base 10) = 0101 (base 2)
                       ---------------
    a[0] | b           = 0111 (base 2) = 7 (base 10)
    
  7. b = 6

    a[0] = 7 (base 10) = 0111 (base 2)
    b    = 6 (base 10) = 0110 (base 2)
                       ---------------
    a[0] | b           = 0111 (base 2) = 7 (base 10)
    
  8. b = 7

    a[0] = 7 (base 10) = 0111 (base 2)
    b    = 7 (base 10) = 0111 (base 2)
                       ---------------
    a[0] | b           = 0111 (base 2) = 7 (base 10)
    
  9. b = 8

    a[0] = 7 (base 10) = 0111 (base 2)
    b    = 8 (base 10) = 1000 (base 2)
                       ---------------
    a[0] | b           = 1111 (base 2) = 15 (base 10)
    
  10. b = 9

    a[0] = 15 (base 10) = 1111 (base 2)
    b    =  9 (base 10) = 1001 (base 2)
                        ---------------
    a[0] | b            = 1111 (base 2) = 15 (base 10)
    

ループの終わりでは、a[0]の値は15です。

90
Jacob George
x |= y;

と同等です

x = x | y;

どこ |ビットごとのORを表します。

50
freakish

ほとんどの代入演算子と同様に、左側の値を使用して演算子を再度適用するのと同じです。

_a |= b
a = a | b
_

と同じように

_a += b
a = a + b
_

詳細については、 Moz Dev Net を参照してください。

[編集:脳の失敗、混乱|および||。もっとコーヒーが必要です。以下に変更]

_|_はビット単位のOR演算子であるため、_a|b_の結果は、aおよびbのすべての1ビットを含むビット文字列を表す整数になります。 javascriptにはネイティブのint型またはビット文字列型がないため、最初にaおよびbをintにキャストし、次にビットに対してビット単位のORを実行することに注意してください。だから9 |バイナリの2は1001です| 0010 = 1011、つまり11ですが、8 | 2 = 8です。

その結果、bのフラグビットがaに追加されます。したがって、フラグがあればWEEVILFLAG=parseInt(00001000,2)

_// a = parseInt(01100001,2)
if(isWeevilish(a))
    a |= WEEVILFLAG;
// now a = parseInt(01101001,2)
_

そのビットをaの1に設定します。

7
Phil H

いずれかまたは両方のオペランドの対応するビットが1である各ビット位置に1を返します。

コード:結果= a | b;

^はビット単位のXOR演算子であり、オペランドの対応するビットの1つ(両方ではない)が1である位置ごとに1を返します。次の例は4(0100)を返します。

5