JavaScript 教程:深入理解位运算符

JavaScript 教程:深入理解位运算符

【免费下载链接】ru.javascript.info Современный учебник JavaScript 【免费下载链接】ru.javascript.info 项目地址: https://gitcode.com/gh_mirrors/ru/ru.javascript.info

位运算符是 JavaScript 中一组特殊的运算符,它们直接操作数字的二进制表示形式。虽然在实际开发中使用频率不高,但在某些特定场景下(如权限控制、加密算法等)非常有用。本文将全面解析 JavaScript 中的位运算符及其应用。

32位二进制表示基础

JavaScript 中的位运算符将操作数视为 32 位二进制序列(由 0 和 1 组成),采用补码形式表示有符号整数:

  1. 最高位(最左边)是符号位:0 表示正数,1 表示负数
  2. 补码规则:负数的二进制表示是其绝对值二进制形式的反码加 1

例如,数字 9 的二进制表示:

00000000000000000000000000001001

而 -9 的二进制表示则是:

11111111111111111111111111110111

位运算符一览表

JavaScript 提供了 7 种位运算符:

运算符名称描述示例
&按位与两个操作数对应位都为1时结果为1a & b
\|按位或两个操作数对应位有一个为1时结果为1a \| b
^按位异或两个操作数对应位不同时结果为1a ^ b
~按位非反转操作数的每一位~a
<<左移将二进制数向左移动指定位数,右侧补0a << b
>>带符号右移保留符号位向右移动,左侧补符号位a >> b
>>>无符号右移向右移动,左侧补0a >>> b

详细解析各运算符

1. 按位与 (&)

规则:两个操作数的对应位都为1时,结果位才为1

9 & 14  // 8
/*
  9:  00001001
 14:  00001110
  & ---------
      00001000 (8)
*/

应用场景:检查特定位是否设置(如权限检查)

2. 按位或 (|)

规则:两个操作数的对应位有一个为1时,结果位就为1

9 | 14  // 15
/*
  9:  00001001
 14:  00001110
  | ---------
      00001111 (15)
*/

应用场景:设置特定位

3. 按位异或 (^)

规则:两个操作数的对应位不同时,结果位为1

9 ^ 14  // 7
/*
  9:  00001001
 14:  00001110
  ^ ---------
      00000111 (7)
*/

特殊性质

  • a ^ a = 0
  • a ^ 0 = a
  • 可逆性:a ^ b ^ b = a

应用场景:简单加密、交换变量值

// 交换两个变量的值(不使用临时变量)
let a = 5, b = 7;
a = a ^ b;
b = a ^ b;
a = a ^ b;

4. 按位非 (~)

规则:反转操作数的每一位(包括符号位)

~9  // -10
/*
  9:  00001001
  ~ ---------
      11110110 (-10)
*/

数学关系~n = -(n+1)

5. 移位运算符

左移 (<<)

规则:将二进制数向左移动指定位数,右侧补0

9 << 2  // 36
/*
  9:  00001001
 <<2 --------
      00100100 (36)
*/

等效操作a << ba * (2^b)

带符号右移 (>>)

规则:保留符号位向右移动,左侧补符号位

9 >> 2  // 2
-9 >> 2 // -3

等效操作a >> bMath.floor(a / (2^b))

无符号右移 (>>>)

规则:向右移动,左侧补0(不考虑符号位)

-9 >>> 2  // 1073741821

实用案例:权限控制系统

位运算在权限控制系统中非常实用。假设我们有如下权限:

  • 查看:1 (0001)
  • 编辑:2 (0010)
  • 删除:4 (0100)
  • 管理:8 (1000)
// 定义权限
const PERMISSIONS = {
  VIEW: 1,
  EDIT: 2,
  DELETE: 4,
  ADMIN: 8
};

// 用户权限组合
let userPermissions = PERMISSIONS.VIEW | PERMISSIONS.EDIT; // 3 (0011)

// 检查权限
function hasPermission(userPermissions, permission) {
  return (userPermissions & permission) === permission;
}

// 添加权限
function addPermission(userPermissions, permission) {
  return userPermissions | permission;
}

// 移除权限
function removePermission(userPermissions, permission) {
  return userPermissions & ~permission;
}

注意事项

  1. 32位限制:所有位运算都限制在32位整数范围内
  2. 运算符优先级:位运算符优先级较低,建议使用括号明确运算顺序
  3. 性能考虑:现代JavaScript引擎中,位运算不一定比常规运算快

总结

位运算符虽然不常用,但在特定场景下非常强大。理解它们的工作原理可以帮助你:

  1. 编写更高效的代码(在适当场景)
  2. 实现紧凑的数据结构(如权限位掩码)
  3. 理解底层计算机原理
  4. 解决特定算法问题

虽然现代JavaScript开发中位运算使用频率不高,但作为专业开发者,理解这些概念仍然是很有价值的。

【免费下载链接】ru.javascript.info Современный учебник JavaScript 【免费下载链接】ru.javascript.info 项目地址: https://gitcode.com/gh_mirrors/ru/ru.javascript.info

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值