返回
JavaScript 中奇特的按位非运算符 ~
前端
2024-01-11 15:10:53
前言
JavaScript 中的运算符是一个强大的工具集,它使我们能够执行各种操作。其中,按位非运算符(~)是一个经常被忽视但功能强大的运算符。本文将深入探讨 ~ 运算符,了解它的工作原理以及如何巧妙地使用它来增强你的 JavaScript 代码。
按位非运算符 (~)
~ 运算符是一个一元运算符,这意味着它只操作一个操作数。它对操作数执行按位非操作,生成一个与输入相反的比特序列。
工作原理
~ 运算符以 32 位有符号整数作为输入,并按照以下步骤执行操作:
- 将输入转换为其二进制补码表示形式。
- 对每个比特取反(0 变为 1,1 变为 0)。
- 将结果转换为有符号整数并返回。
用法
~ 运算符的主要用途是按位取反。这在以下情况下很有用:
- 反转布尔值: ~true 为 false,~false 为 true。
- 生成补码: ~x 返回 x 的补码表示形式,这是二进制表示形式中符号位(最高有效位)取反后的值。
- 清除特定位: ~x & mask 可以用于清除 x 中由 mask 指定的比特。
示例
// 按位取反布尔值
console.log(~true); // -1 (二进制表示为 11111111111111111111111111111111)
// 生成补码
console.log(~10); // -11 (二进制表示为 11111111111111111111111111110101)
// 清除特定位
const mask = 0b11111111111111111111111111111101;
console.log(10 & mask); // 9 (二进制表示为 00000000000000000000000000001001)
高级用法
~ 运算符还可以用于一些高级技术,例如:
- 生成掩码: ~0 可以生成一个 32 位掩码,所有比特都为 1。
- 位计数: ~x & (x + 1) 可以计算 x 中 1 的数量。
- 快速绝对值: ~x + 1 可以快速计算 x 的绝对值,前提是 x 为非负整数。
注意事项
在使用 ~ 运算符时,需要注意以下几点:
- 运算符的输入和输出都必须是有符号 32 位整数。
- ~ 运算符不适用于浮点数或字符串。
- ~ 运算符的结果可能是负数,具体取决于输入值。
结论
~ 运算符是一个功能强大的 JavaScript 工具,可用于执行按位非操作和各种高级技术。通过理解它的工作原理和巧妙的用法,你可以扩展你的 JavaScript 代码库,并编写出更优雅和高效的代码。