JavaScript位运算取整本质是将数字转为32位有符号整数后向零截断,非四舍五入,也不等同Math.floor或Math.ceil;常用写法包括num | 0、~~num、num ^ 0,效果一致。

JavaScript 中用位运算取整,本质是把数字转成 32 位有符号整数后直接丢掉小数部分,属于“向零截断”,不是四舍五入,也不等同于 Math.floor 或 Math.ceil。它快但有边界限制,适合明确知道数值范围的场景。
常用位运算取整写法
以下几种写法效果一致,都是向零截断:
-
num | 0:按位或 0,最常见也最易理解 -
~~num:双按位非,先取反再取反,等价于截断(注意不是“负负得正”的数学逻辑,而是两次补码转换) -
num ^ 0:按位异或 0,同样触发整数转换 num :左移 0 位,也会隐式转为 32 位整数
行为特点:只截断,不分正负
无论正数还是负数,都直接去掉小数部分,不进位也不退位:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
12.9 | 0→ 12 -
-12.9 | 0→ -12(不是 -13) -
0.1 | 0→ 0 -
-0.9 | 0→ 0
必须注意的限制
所有位运算取整都受限于 32 位有符号整数范围:[-2147483648, 2147483647]:
立即学习“Java免费学习笔记(深入)”;
- 超出这个范围会溢出,结果不可靠。例如:
2147493647.5 | 0可能返回负数 -
NaN、null、空数组等假值会先被转成0,再参与运算,结果是0;这有时是优点(避免报错),有时是隐患(掩盖类型问题) - 不能处理
Infinity和-Infinity,结果为0
现代替代建议
如果目标只是向零截断,Math.trunc() 是更清晰、安全的选择:
- 语义明确,可读性强,无范围陷阱
- 支持任意大小的数字,包括
BigInt(配合BigInt(Math.trunc(x))) - 对
NaN返回NaN,符合预期,不会静默转成0 - 性能差距在现代引擎中已极小,不必为微弱优势牺牲可维护性

















