&、|、^ 到底在干嘛?一次讲透 JavaScript 位操作符

19 阅读4分钟



那是一个加班到深夜的晚上。我盯着屏幕里的 JavaScript 代码,突然看到一行让我心头一紧的东西:

a & b

“???”

这不是逻辑与 &&,也不是条件判断,它像个符号学家,冷静、克制、没有感情。那一刻,我仿佛被吸进了一个只有 0 和 1 的世界

欢迎来到二进制王国。在这个世界里,没有字符串、没有对象、没有数组,只有:

位(bit)0 和 1

而位操作符,就是这个世界里的骑士、守卫、工匠和魔法师。今天,小米就带你一起,在二进制王国里走一圈,把 JavaScript 的 7 个位操作符 全部搞明白。

先打个地基:什么是「位操作」

在 JavaScript 中:

所有位操作,都会先把数字转换成 32 位有符号整数

举个例子:

5

在二进制王国里,其实是:

00000000 00000000 00000000 00000101

也就是说:

  • JS 会把数字转成 32 位
  • 二进制位 一位一位地操作
  • 最后再把结果转回十进制

记住这一点,后面你会少掉一半的坑。

第一位登场的角色:按位非(~)

按位非:二进制世界的“反转魔法”

按位非只有一个操作数:

~x

规则非常简单粗暴:0 变 1,1 变 0

就像一面魔镜。在二进制王国,有一位魔法师,叫 Mirror(镜像) 。他不管你是谁,只做一件事: “我看你顺眼,就全给你反过来。”

1、示例

~5

5 的二进制:

00000000 00000000 00000000 00000101

取反后:

11111111 11111111 11111111 11111010

这是一个 负数,最终结果是:

~5 === -6

2、为什么是 -6?

因为: ~x = -(x + 1), 这是位操作里最容易让人怀疑人生的地方。

3、常见用途

  • 快速判断 indexOf 是否存在(老代码里很常见)

虽然现在更推荐用 includes,但你看到它时,至少不会慌。

按位与(&):最严格的守门员

按位与:两个都是 1,才放行

1、规则:

2、故事类比

二进制王国的城门口,站着一位守卫,名字叫 AND。他的原则只有一句话: “你们俩都同意,我才放行。”

3、示例

5 & 3

二进制拆解:

结果:

5 & 3 === 1

4、常见用途

  • 权限控制
  • 掩码判断
  • 判断奇偶

5、x & 1

  • 结果为 1 → 奇数
  • 结果为 0 → 偶数

按位或(|):只要有一个同意

按位或:一个是 1,就通过

1、规则:

2、故事类比

OR 是一个非常佛系的官员: “你们俩,只要有一个点头,我就当通过。”

3、示例

5 | 3

结果:

5 | 3 === 7

4、常见用途

  • 合并标志位
  • 设置某个 bit 为 1

按位异或(^):不同才是王道

按位异或:相同为 0,不同为 1

1、规则:

2、故事类比

异或是二进制王国的叛逆青年“你跟我一样?不行。不一样?这才有意思。”

3、示例

结果:

5 ^ 3 === 6

4、神奇用途

不用第三个变量交换两个数

左移(<<):整体向左搬家

左移:乘以 2 的艺术

1、规则:

x << n

所有位向左移动 n 位,右边补 0

2、故事类比

左移就像: “全体向左平移,右边新来的,全是 0。”

3、示例

5 << 1

0101 → 1010

结果:

5 << 1 === 10

4、规律

x << 1 === x * 2

x << 2 === x * 4

有符号右移(>>):保留性格的后退

有符号右移:看你是正是负

1、规则:

x >> n

向右移,左边补 符号位

2、故事类比

这是一个讲出身的官员“你原来是好人(正数),我就补 0;你原来是坏人(负数),我就补 1。”

3、示例

5 >> 1 // 2

-5 >> 1 // -3

无符号右移(>>>):一视同仁的清零派

无符号右移:不管你是谁

1、规则:

x >>> n

无论正负,左边都补 0

2、故事类比

这是二进制王国的冷酷机器“我不看背景,不讲感情,统一补 0。”

3、示例

-5 >>> 1

结果是一个非常大的正数。这也是很多人第一次看到 >>> 时震惊的地方。

七大位操作符一张表总结

总结:为什么你应该懂位操作符?

很多同学会说:“小米,这玩意我平时也不用啊。”

但我想说的是:

  • 你看源码时,会遇到它
  • 你做性能优化时,会用到它
  • 你面试时,它会跳出来拦助你

位操作符,就像:城市地下的管道系统, 平时你看不到,但它决定了系统跑得快不快、稳不稳。

END

如果你觉得这篇文章让你第一次不害怕位操作符了,那就点个赞、转发给那个“看到 & 就想用 && 的朋友”。

我是小米,一个喜欢分享技术的31岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货!