我在JS项目中找到了以下代码:
var a = new Array();
a[0] = 0;
for (var b = 0; b < 10; b++) {
a[0] |= b;
}
|=
在for循环体中做了什么?
代码示例可疑,但V8提供了here,以提高性能。
更新了示例
对于大多数意图和目的,上面的示例等同于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
}
答案 0 :(得分:84)
a[0] |= b
基本上是
a[0] = a[0] | b
<强>更新强>
在a[0]
分配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
答案 1 :(得分:49)
x |= y;
相当于
x = x | y;
其中|
代表按位OR 。
答案 2 :(得分:7)
与大多数赋值运算符一样,它等同于再次使用左手值应用运算符:
a |= b
a = a | b
就像
一样a += b
a = a + b
查看Moz Dev Net了解更多信息。
[编辑:大脑失败,混淆了|和||。需要更多咖啡。修改如下]
由于|
是按位OR运算符,a|b
的结果将是表示具有a
和b
的所有1位的位串的整数。请注意,javascript没有native int或bitstring类型,因此它首先将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)
将该位设置为1。
答案 3 :(得分:5)
在每个位的位置返回一个,其中一个或两个操作数的相应位为1。
代码: result = a | B;
^
是按位XOR运算符,它为每个位置返回一个运算符,其中一个(不是两个)其操作数的相应位是1。下一个示例返回4(0100):