Javascript `Math.trunc`vs`|0`vs`<&书信电报;0`vs`>&燃气轮机;0`vs`&-1`vs`^0`

Javascript `Math.trunc`vs`|0`vs`<&书信电报;0`vs`>&燃气轮机;0`vs`&-1`vs`^0`,javascript,math,bit-manipulation,truncated,Javascript,Math,Bit Manipulation,Truncated,我刚刚发现在ES6中有一种新的数学方法:math.trunc 我在中阅读了它的描述,听起来像是在使用|0 此外,0,和-1,^0也会做类似的事情(谢谢@kojiro和@Bergi) 经过一些测试,唯一的区别似乎是: Math.trunc返回间隔为(-1,-0]的数字的-0。按位运算符返回0 Math.trunc返回非数字的NaN。按位运算符返回0 (他们之间)有更多的差异吗 那么Math.trunc(Math.pow(2,31))与Math.pow(2,31)|0 逐位运算是在有符号的32

我刚刚发现在ES6中有一种新的数学方法:
math.trunc

我在中阅读了它的描述,听起来像是在使用
|0

此外,
0
和-1
^0
也会做类似的事情(谢谢@kojiro和@Bergi)

经过一些测试,唯一的区别似乎是:

  • Math.trunc
    返回间隔为
    (-1,-0]
    的数字的
    -0
    。按位运算符返回
    0
  • Math.trunc
    返回非数字的
    NaN
    。按位运算符返回
    0
(他们之间)有更多的差异吗


那么
Math.trunc(Math.pow(2,31))与
Math.pow(2,31)|0


逐位运算是在有符号的32位整数上执行的。因此,当您进行Math.pow(2,31)运算时,您会得到位为“100000000000000000”的表示形式。因为这个数字必须转换成有符号的32位形式,我们现在在符号位的位置有一个1。这意味着我们在看有符号的32位形式的-eve数字。然后当我们按位或用0进行运算时,我们得到有符号的32位形式的相同结果。在十进制中,它是-2147483648


旁注:在有符号32位形式中,可以用二进制表示的小数范围为[10000000000000000000000001111111111111111]。以十进制(以10为基数)表示的小数范围为[-2147483648,2147483647].

在许多使用位运算符的编程语言中,尝试对非整数执行位运算是一种类型错误:

>>> # Python
>>> 1 << 0; 1.2 << 0
1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for <<: 'float' and 'int'

别忘了
>0
&-1
^1
)@kogiro哦,我不知道他们也做同样的事,但我想
|0
更常见,因为它在asm中使用。jsI并不意味着他们做完全相同的事情。它们做的不一样,但它们做的事情相似,所以如果你对比这些操作,也值得把这些东西放在里面。你可能是说
^0
,不是吗?:-)@kojiro,你能进一步解释一下这些位运算符之间的区别吗?啊,如果得到的整数不能适应32位整数,二进制运算符会失败(在截断过程中),不是吗?位运算是在有符号的32位整数上执行的。所以,当你做Math.pow(2,31)时,你会得到这个以位“100000000000000000000000”表示的表达式。因为这个数字必须转换成有符号的32位形式,我们现在在符号位位置有一个1。这意味着我们要看的是有符号32位形式的-eve数字。然后,当我们对0进行按位或运算时,我们得到的是有符号32位形式的相同结果。十进制为-2147483648。您可能需要稍微修改按位标识操作。首先,i | 0是一个OR运算,将对每个参数的每个位执行OR比较。由于第二个参数是0,因此返回i的32位表示形式。如果两个位不同,则XOR运算返回1,如果两个位相同,则返回0,因此它与OR运算符不同。@JamesJensen您能给我举一个数字
i
的例子吗?对于这个数字
i | 0
i^0
给出不同的结果,我深表歉意。显然,我在逻辑课上惨败,不知道如何执行异或运算。没问题。谢谢你的优雅。
>>> # Python
>>> 1 << 0; 1.2 << 0
1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for <<: 'float' and 'int'
i |  0 // For each bit that is 1, return 1|0. For each bit that is 0, return 0|0.
i ^  0 // xor, but effectively same as previous.
i << 0 // Shift the value left zero bits.
i >> 0 // Shift the value right zero bits.
i & -1 // Identity mask
~~i    // Not not - I had forgotten this one above.