在JavaScript中,位非运算符(~)是一种按位操作符,它对其操作数的每个位执行取反操作。这个操作返回一个32位的整数,其中最高位被解释为符号位,因此位非运算符可以将一个正整数转换为负整数,并且将一个负整数转换为其绝对值减1的正整数。
用法
位非运算符(~)的语法如下:
~x
其中x是一个数字表达式或带有数字属性的变量。该表达式将首先被转化为32位二进制补码形式,然后将所有位取反。最后,结果将再次转换回十进制形式。
以下是位非运算符的几个示例:
console.log(~0); // -1 console.log(~1); // -2 console.log(~-1); // 0 console.log(~(2**31));// 2147483647
对于任何n,~n等价于-(n+1)。例如:
console.log(~3); // -4 console.log(-(3+1)); // -4
应用场景
取反操作
由于位非运算符将所有位取反,因此它可以用于执行各种取反操作。例如,可以通过将x与一个掩码进行位异或来翻转x的特定位:
var x = 0b10101010; // 170 var mask = 0b11110000; console.log((x ^ mask).toString(2)); // "10111010"
相反,可以使用位非运算符来快速地对二进制数进行补码取反:
var x = 0b10101010; // 170 console.log((~x).toString(2)); // "-1010111"
整型数组的操作
由于在JavaScript中没有真正的整型类型,因此无法执行固定位宽度的位操作。但是,在ES6中,我们可以通过TypedArray将一段内存解释为整型数组并对其进行位操作。
例如,以下代码创建了一个Int8Array,并使用位非运算符将其所有元素取反:
var arr = new Int8Array([0b10101010, 0b01010101, -1]); for (var i = 0; i < arr.length; i++) { arr[i] = ~arr[i]; } console.log(arr); // [-171, -86, 0]
快速计算哈希值(Hash)
由于位非运算符返回一个32位整数,因此可以将其视为哈希函数的一种简单实现。例如,可以使用位非运算符将字符串转换为唯一的数字ID:
-- -------------------- ---- ------- -------- --------- - --- -- - -- --- ---- - - -- - - ----------- ---- - -- - --- -- -- - -- - ------------------ -- -- -- -- ------------- - ------ ---- - --------------------------- -- -----------
注意事项
使用位非运算符时,请务必注意操作数的数据类型。如果操作数不是数字,则会自动转换为数字。如果操作数是字符串,则首先将其转换为数字,然后再执行位非操作。
此外,请注意,在JavaScript中,所有数字都以IEEE 754双精度浮点格式表示,因此一些位非运算的结果可能会出乎意料。例如:
console.log(~3.14); // -4 console.log(~3.99); // -4 console.log(~4); // -5
这是因为在IEEE 754格式下,某些小数值的二进制表示与相邻整数值非常接近。当这些值被转换为32
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/27180