按位与& 运算

154 阅读3分钟

一、补充——按位与& 运算

1.1 基本语法

按位与运算符 & 是 JavaScript 中的一种位运算符,它对两个数的二进制表示的每一位进行逻辑“与”操作。以下是详细解释:

1.1.1. 基本规则

定义:对两个数的二进制表示的每一位进行比较,当且仅当两个对应位均为 1 时,结果位为 1,否则为 0。
语法:a & b,其中 a 和 b 可以是任意整数或可转换为整数的值。

示例:

5 & 3;  // 结果:1

二进制计算过程:
Text
5 → 0101
3 → 0011
---------
& → 0001 (即十进制的 1)

1.1.2. 操作数转换规则

JavaScript 中的数字以 64 位双精度浮点数存储,但按位运算会先转换为 32 位有符号整数,运算完成后再转回 64 位:

  • 正数:直接截断到 32 位。
  • 负数:补码表示。
  • 非整数:小数部分直接丢弃(非四舍五入)。

示例:

5.9 & 3.1; // 5 & 3 → 1
-5 & -3;   // 补码运算 → 结果:-7

1.1.3. 常见应用场景

(1) 判断奇偶性
function isEven(n) {
  return (n & 1) === 0;
}
isEven(6); // true
原理:二进制最后一位为 0 则是偶数,为 1 则是奇数。
(2) 权限系统(位掩码)

用不同位表示不同权限,通过 & 检查是否拥有某权限:

const READ = 1;    // 0001
const WRITE = 2;   // 0010
const EXECUTE = 4; // 0100

let userPermissions = READ | WRITE; // 0011

// 检查是否有写权限
if (userPermissions & WRITE) { // 0011 & 0010 → 0010 ≠ 0
  console.log("可写");
}
(3) 快速取整
Math.floor(3.7) === (3.7 & -1); // true
注意:仅适用于 32 位范围内的整数(即 -2^312^31-1)。
(4) 消除二进制最后一个 1 → 即本题解法之一
let x = 12; // 1100
x = x & (x - 1); // 1100 & 1011 → 1000
应用:统计二进制中 1 的个数(见下方代码 || 本题力扣我的解法)。

1.1.4. 实用代码示例

(1) 统计二进制中 1 的个数
function countOnes(x) {
  let count = 0;
  while (x !== 0) {
    x &= x - 1; // 消除最后一个 1
    count++;
  }
  return count;
}
countOnes(7); // 3(二进制 111)
(2) 检查是否为 2 的幂
function isPowerOfTwo(n) {
  return n > 0 && (n & (n - 1)) === 0;
}
isPowerOfTwo(8); // true
原理:2 的幂的二进制只有最高位是 1,n & (n - 1) 会消除最后一个 1,结果为 0

1.1.5. 注意事项

(1) 大数截断:

超出 32 位的数会被截断,例如:

(Math.pow(2, 32) + 1) & 1; // 0(原数为 4294967297 → 截断为 1)
(2) 运算符优先级:

& 优先级低于比较运算符(如 ==、>),建议用括号明确逻辑:

(a & b) === c; // 正确写法
a & b === c;    // 错误!等价于 a & (b === c)
(3) 非整数处理:

小数会被直接截断,例如:

3.9 & 5.1; // 3 & 5 → 1

1.1.6. 总结

按位与 & 是一种高效的二进制操作工具,适用于权限控制、数值优化、位掩码等场景。使用时需注意其转换规则和运算符优先级,避免因截断或逻辑错误导致意外结果。