运算符|=在JavaScript中做什么?

运算符|=在JavaScript中做什么?,javascript,operator-keyword,Javascript,Operator Keyword,我在一个JS项目中发现了以下代码: var a = new Array(); a[0] = 0; for (var b = 0; b < 10; b++) { a[0] |= b; } 相当于 x = x | y; 其中,|表示按位或。与大多数赋值运算符一样,它相当于再次使用左手值应用运算符: a |= b a = a | b 就像 a += b a = a + b 期待更多 [编辑:大脑衰竭,混淆了|和| |。需要更多咖啡。修改如下] 由于|是按位OR运算符,a | b的结

我在一个JS项目中发现了以下代码:

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

x = x | y;

其中,
|
表示按位或。

与大多数赋值运算符一样,它相当于再次使用左手值应用运算符:

a |= b
a = a | b
就像

a += b
a = a + b
期待更多

[编辑:大脑衰竭,混淆了|和| |。需要更多咖啡。修改如下]

由于
|
是按位OR运算符,
a | b
的结果将是表示位字符串的整数,其中包含
a
b
的所有1位。请注意,javascript没有本机int或bitstring类型,因此它将首先将
a
b
转换为int,然后对位执行按位或。所以二进制中的9 | 2是1001 | 0010=1011,这是11,但8 | 2=8

其效果是将
b
的标志位添加到
a
中。因此,如果您有一些标志
weevillflag=parseInt(000011000,2)

将该位设置为a中的1

a[0] |= b
基本上

a[0] = a[0] | b
“|”是一个

更新 当分配了
a[0]
时,二进制的
a[0]
0000
。在循环中

  • 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)
    
  • 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)
    
  • 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)
    
  • 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)
    
  • 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)
    
  • 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)
    
  • 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)
    
  • 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)
    
  • 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)
    
  • 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

    在每个位位置返回一个值,其中一个或两个操作数的对应位为一

    代码: 结果=a | b


    ^
    是按位异或运算符,它为每个位置返回一个1,其中其操作数的一个(不是全部)对应位为1。下一个示例返回4(0100):

    这与逻辑or相同?例如,var a=“title”| | xYou混淆了逻辑OR和按位OR.Bah。按位或非逻辑或。大脑是有趣的东西。现在修好了。有惯用的意思吗?或者一些技巧,比如当你用
    ~
    ?@katspaugh向下浮动时。例如,它可以用于高效编码和特权检查(这也适用于OP代码)。阅读。@katspaugh你所说的“带~~的地板向下浮动”是什么意思?我从没听说过这样的事@user1638092很高兴能为您提供帮助:)而且为了明确起见,步骤4、6、7、8和10都是冗余的,所以这个循环是性能提高的一个很糟糕的例子……我刚刚意识到它来自这里的代码@razpeitia读了这个问题,你会发现这个URL。。。
    a[0] = 7 (base 10) = 0111 (base 2)
    b    = 7 (base 10) = 0111 (base 2)
                       ---------------
    a[0] | b           = 0111 (base 2) = 7 (base 10)
    
    a[0] = 7 (base 10) = 0111 (base 2)
    b    = 8 (base 10) = 1000 (base 2)
                       ---------------
    a[0] | b           = 1111 (base 2) = 15 (base 10)
    
    a[0] = 15 (base 10) = 1111 (base 2)
    b    =  9 (base 10) = 1001 (base 2)
                        ---------------
    a[0] | b            = 1111 (base 2) = 15 (base 10)