为什么在Javascript中OR 0回合数?

时间:2013-08-13 21:21:29

标签: javascript bit-manipulation

根据IEEE浮点标准,我认为Javascript中的Number类型存储任何数字,整数或浮点数。如果是这样,那么为什么用0对数字进行按位OR运算呢?

使用其他位操作时,似乎在将位操作应用于浮点数时,该数字首先向0舍入,然后应用位操作(数字以二进制补码表示而不是IEEE)。这是对的吗?

3 个答案:

答案 0 :(得分:3)

在ECMAScript 5.1中,所有按位操作都会将输入转换为32位整数,并返回32位整数。关于运营商^&|section 11.10说:

  

生产A : A @ B,其中@是其中一个按位运算符   上述作品评估如下:

     

1)让lref成为评估A.的结果   2)让lval为GetValue(lref)   3)让rref成为评估B的结果   4)让rval为GetValue(rref)。
  5)让lnum为ToInt32(lval)。
  6)让rnum为ToInt32(rval)。
  7)归还   将按位运算符@应用于lnum和rnum的结果。结果   是带符号的32位整数。

请注意,在应用运算符之前,ToInt32应用于双方。

答案 1 :(得分:2)

来自MDN

  

按位运算符将其操作数视为32位(零和1)的序列,而不是十进制,十六进制或八进制数。

如果你没有对这样的数字进行处理,那么按位操作会没有多大意义,这就是为什么它已经完成了

答案 2 :(得分:1)

在语言级别,只有浮点数和按位运算符的临时整数。

Per spec,通过执行抽象操作将float转换为32位整数:

var n = (sign(number) * floor(abs(number))) % pow(2, 32);
if( n >= pow( 2, 31 ) ) {
     return n - pow( 2, 32 );
}
else {
     return n;
}

我必须强调这个操作是抽象的,当然不是由任何引擎以上述方式完成的,所以不要从中得出任何性能考虑因素。 (这适用于任何其他规范操作)