那是一个加班到深夜的晚上。我盯着屏幕里的 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岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货!