返回

JavaScript 中奇特的按位非运算符 ~

前端

前言

JavaScript 中的运算符是一个强大的工具集,它使我们能够执行各种操作。其中,按位非运算符(~)是一个经常被忽视但功能强大的运算符。本文将深入探讨 ~ 运算符,了解它的工作原理以及如何巧妙地使用它来增强你的 JavaScript 代码。

按位非运算符 (~)

~ 运算符是一个一元运算符,这意味着它只操作一个操作数。它对操作数执行按位非操作,生成一个与输入相反的比特序列。

工作原理

~ 运算符以 32 位有符号整数作为输入,并按照以下步骤执行操作:

  1. 将输入转换为其二进制补码表示形式。
  2. 对每个比特取反(0 变为 1,1 变为 0)。
  3. 将结果转换为有符号整数并返回。

用法

~ 运算符的主要用途是按位取反。这在以下情况下很有用:

  • 反转布尔值: ~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 代码库,并编写出更优雅和高效的代码。