JavaScript中向零取整的常用位运算有:num | 0、~~num、num >> 0、num ^ 0,均将数字转为32位有符号整数并截断小数,行为等同Math.trunc(),适用于受控范围内的高性能场景。

JavaScript 中位运算符能快速截断小数部分,实现向零取整,适用于已知输入在安全整数范围内(−2³¹ 到 2³¹−1)且无需四舍五入或方向性取整的场景。
哪些位运算可以取整
常用且等效的方式有:
- num | 0:按位或 0,最直观,语义明确为“转 32 位整数”
- ~~num:双取反,本质是 ~(~num),因补码特性最终丢弃小数
- num >> 0:右移 0 位,强制转为有符号 32 位整数
- num ^ 0:按位异或 0,效果同 | 0,但稍少见
它们都只处理数字部分,不关心正负号,-4.9 | 0 得到 -4,不是 -5。
和 Math 方法的区别很关键
位运算不是 Math.floor 或 Math.ceil 的替代品,而是另一类语义:
立即学习“Java免费学习笔记(深入)”;
- Math.floor(4.9) → 4,Math.floor(-4.9) → -5(向下取整)
- Math.ceil(4.1) → 5,Math.ceil(-4.1) → -4(向上取整)
- num | 0 和 Math.trunc(num) 行为一致:一律去掉小数,向零截断
所以若业务要求“负数也要朝零靠近”,比如坐标偏移、索引计算、帧数计数,| 0 是合理选择;若做分页总页数,必须用 Math.ceil。
使用时要注意的边界
位运算取整依赖 32 位有符号整数转换,超出范围会出错:
- 超过 2147483647(2³¹−1)或低于 -2147483648(−2³¹)时,结果翻转或失真
- 例如:
2147483648 | 0得 -2147483648,不是原值 - NaN、Infinity、非数字字符串(如 "abc")会变成 0,而 Math.trunc 会返回 NaN,更易暴露问题
现代项目中,若仅需向零截断,推荐优先用 Math.trunc()——语义清晰、无溢出陷阱、支持任意大小数值。
什么情况下值得用位运算
真正适合位运算取整的,是性能敏感、循环密集、且数据受控的底层逻辑:
- Canvas 像素遍历中的坐标归一化(如
(x / scale) | 0) - WebGL 索引缓冲计算、哈希表桶定位(配合 capacity−1 掩码)
- 游戏引擎中每帧执行上万次的位置取整
普通业务代码里,可读性和健壮性比省几个纳秒更重要。位运算不是“高级技巧”,而是特定约束下的工程权衡。


















