5 & 3 等于 1,因 JavaScript 位运算先将操作数转为32位有符号整数补码(5为0000...0101,3为0000...0011),再按位与得0000...0001,转回十进制即1。

JavaScript 中的位运算符直接操作数字的二进制表示,但它们的输入和输出都是十进制数。理解“为什么 5 & 3 等于 1”,关键在于掌握“十进制 → 二进制 → 位运算 → 十进制”这一完整转换链。
位运算符只对整数的32位补码形式生效
JavaScript 数字是双精度浮点型(64位),但所有位运算符(&、|、^、~、、<code>>>、>>>)会先将操作数强制转为带符号的32位整数(即执行 ToInt32 转换),再按补码规则进行运算。
- 正数补码 = 原码(如
5→00000000 00000000 00000000 00000101) - 负数补码 = 反码 + 1(如
-5→ 先取5的原码,逐位取反,再加 1) - 小数会被截断(
7.8 & 2等价于7 & 2) - 超出 32 位范围的数会被取模(
Math.pow(2, 33) | 0 === 0)
常见位运算符的计算步骤(以 & 为例)
以 5 & 3 为例,分四步还原逻辑:
- 转整数:5 和 3 已是整数,保持不变
-
转32位二进制(补码):
5→00000000 00000000 00000000 000001013→00000000 00000000 00000000 00000011 -
按位与(同为1才得1):
00000000 00000000 00000000 00000001→ 即十进制1 -
结果转回十进制:最高位为 0,是正数,直接按原码解读为
1
快速心算技巧与易错点
不必每次手写32位,掌握这些规律可提速判断:
立即学习“Java免费学习笔记(深入)”;
-
与(&)常用于“取位”:如
n & 1判断奇偶(看最低位是否为1);n & 0xFF提取低8位 -
或(|)常用于“置位”:如
flag | 0b00000010把第2位设为1 -
异或(^)是无进位加法:相同为0、不同为1;
n ^ n === 0,n ^ 0 === n,a ^ b ^ a === b -
注意符号扩展:
>>是算术右移(负数高位补1),>>>是无符号右移(高位恒补0)。例如-4 >> 1 === -2,但-4 >>> 1 === 2147483646(因补码被当作大正数解读)
验证与调试建议
在浏览器控制台中可这样辅助理解:
- 用
(n).toString(2)查看二进制(注意:它返回的是正数原码,不带前导零和符号位) - 用
console.log(new Int32Array([n])[0])强制观察32位整数表现 - 对负数,可用
((-n) ^ 0xFFFFFFFF) + 1手动验算补码 - 写个小函数模拟:比如
function and32(a, b) { return (a | 0) & (b | 0); },明确强调截断意图










