它会删除小数点后的所有内容,因为按位运算符将其操作数隐式转换为有符号的 32 位整数。无论操作数是(浮点)数字还是字符串,这都有效,结果是数字。
换句话说,它产生:
function(x) {
if(x < 0) return Math.ceil(x);
else return Math.floor(x);
}
仅当x介于 -(2 31 ) 和 2 31 - 1 之间时。否则,将发生溢出并且数字将“环绕”。
这对于将函数的字符串参数转换为数字可能被认为是有用的,但是由于溢出的可能性以及与非整数一起使用不正确,我不会以这种方式使用它,除了“代码高尔夫”(即以牺牲可读性和健壮性为代价,毫无意义地从程序的源代码中删除字节)。我会使用+xorNumber(x)代替。
这怎么是NOT的NOT
数字-43.2,例如是:
-43.2 10 = 11111111111111111111111111010101 2
作为有符号(二进制补码)32 位二进制数。(JavaScript 忽略小数点后的内容。)反转位给出:
非 -43 10 = 00000000000000000000000000101010 2 = 42 10
再次反转给出:
非 42 10 = 11111111111111111111111111010101 2 = -43 10
这不同于Math.floor(-43.2)负数向零舍入,而不是远离零。(等于 -44 的 floor 函数总是向下舍入到下一个较小的整数,无论该数字是正数还是负数。)