位运算模拟器(AND、OR、XOR、NOT、移位)

对两个数值计算 AND、OR、XOR、NOT、左移、右移,并通过二进制网格直观展示每一位的变化。支持 8/16/32 位宽。

什么是位运算

位运算是把数值看作一串二进制数字(0 和 1),逐位进行逻辑运算的操作。AND(与)、OR(或)、XOR(异或)、NOT(取反)、移位(左移、右移)是最具代表性的五种运算,它们都是 CPU 能够直接执行的基础指令,速度远快于加减乘除等算术运算。在编程语言中通常写作 `&`、`|`、`^`、`~`、`<<`、`>>`,广泛应用于标志位管理、权限设计、加密算法、图像处理等场景。

本工具可以指定数值 A、数值 B(NOT 运算只使用数值 A)以及位宽(8/16/32 位),并以网格形式逐位展示运算结果。数值支持十进制输入,也可以使用 `0x`(十六进制)或 `0b`(二进制)前缀,与代码中的写法保持一致。需要注意的是,超出所选位宽的数值无法被正确表示,因此先确定好位宽,再观察结果会更容易理解。

位运算模拟器的使用方法

  1. 选择位宽 在 8/16/32 位之间选择。不确定时建议先从 8 位开始,网格较小,更容易看清每一位的变化。
  2. 选择运算类型 在 AND、OR、XOR、NOT、左移、右移中选择。切换为 NOT 时,输入框会自动变为只需一个数值。
  3. 输入数值 为数值 A(以及 NOT 以外运算所需的数值 B)输入十进制、十六进制(`0x` 前缀)或二进制(`0b` 前缀)数字;若选择移位运算,还需指定移位位数。
  4. 查看结果网格 结果会自动计算并逐位展示,黄色高亮的位表示相对于原数值发生了变化。
  5. 对照十进制与十六进制 结果行下方会同时给出十进制、十六进制表示,方便与代码或文档中的数值互相核对。

用好本工具的小技巧

  • 数值不仅可以输入十进制,还可以使用 `0x1A` 形式的十六进制或 `0b1010` 形式的二进制前缀,直接照抄代码中的写法即可。
  • AND、OR、XOR 需要两个数值,NOT 只需要一个数值。切换运算类型时,输入框数量会自动调整。
  • 右移(`>>>`)本工具只支持逻辑移位。它与保留符号位的算术移位有何不同,请参见下方常见问题。
  • 将位宽从 8 位切换到 16 位、32 位,可以直观看到同一个数值的高位会补上更多的 0,有助于理解“位宽”的真正含义。
  • 黄色高亮的位表示演算前后发生变化的位。使用 AND、OR 时,可以直观追踪哪个输入值在每一位上“胜出”。

位运算模拟器的应用场景

编程学习中的验证

在学习 C、Java、Python 等语言时,NOT 和移位运算往往难以心算,通过可视化网格逐位确认,能更快建立直觉。

位标志与权限系统设计

如 Unix 文件权限、将多个开关状态压缩进一个整数管理的“位标志”设计,可以先在这里试验 AND 掩码提取、OR 置位等操作。

竞赛编程与位掩码算法验证

位掩码动态规划、集合的位表示等技巧,可以先用较小的数值在本工具中验证运算结果是否符合预期。

十六进制与二进制换算核对

在确认运算结果的同时核对进制换算关系,可与站内的进制转换工具配合使用。

颜色代码与网络地址计算

从颜色代码中提取红、绿、蓝分量,或计算 IP 地址与子网掩码的 AND 结果,都是位运算的常见实际用途。

位运算术语表

AND(与)
只有当两个位都为 1 时,结果才为 1,常用于通过掩码提取特定位。
OR(或)
只要有一个位为 1,结果就为 1,常用于置位(把某些位设为 1)。
XOR(异或)
只有当两个位不同时,结果才为 1,常用于翻转某些位、交换数值或检测差异。
NOT(取反)
把一个数值的所有位逐一反转,结果如何表示取决于所选的位宽。
移位运算
把二进制位模式整体向左或向右移动。左移相当于乘以 2 的幂,右移相当于除以 2。
位掩码
配合 AND、OR 使用、用来提取或改写特定位的数值,例如 `0b00001111` 可用于提取最低 4 位。
位宽
表示一个数值所使用的位数。8 位可表示 0~255,16 位可表示 0~65535。
二进制 / 十六进制
二进制只使用 0 和 1 表示数值,十六进制使用 0~9 和 A~F,常作为二进制数位分组的简洁记法。

常见问题

有区别。逻辑移位(`>>>`)始终用 0 填充空出的高位,而算术移位(`>>`)则会复制符号位(最高位)来填充。由于本工具将数值视为指定位宽内的非负整数,符号并非核心概念,因此只提供更易理解的逻辑移位。

JavaScript 的位运算符内部按 32 位有符号整数计算,例如对 8 位的 `00000001`(1)取反,通常会得到 `-2` 这样的负数。本工具会按你选择的位宽(8/16/32)重新掩码结果,因此在 8 位下会正确显示为 `11111110`(254),即该位宽下的正确表示。

AND 只有当两个位都为 1 时结果才为 1,常用于提取特定位的掩码操作。OR 只要有一个位为 1 结果就为 1,常用于置位(把某些位设为 1)。XOR 只有两个位不同时结果才为 1,常用于翻转某些位或交换两个数值。

左移(`<<`)是快速实现乘以 2 的幂(如乘 2、乘 4)的方法,右移(本工具为逻辑移位)常用于除以 2 或从数值中提取特定范围的位。这两者在竞赛编程和基于位掩码的算法中也非常常见。

严格来说并不完全相同。位运算指的是 AND、OR、XOR、NOT、移位这些运算本身,而位掩码是配合这些运算(尤其是 AND、OR)使用的一个数值,用来“只提取或改写特定的位”。例如 `value & 0b00001111` 就是提取最低 4 位的典型位掩码用法。
工具君

闲话 ― XOR 的奇妙特性与实际应用

位运算直接对应计算机内部的逻辑电路,是 CPU 能够执行得最快的运算之一,通常只需一个时钟周期。由于所需电路远比乘法、除法简单,性能敏感的场景(图像处理、加密算法、网络协议实现等)长期以来都会用位运算技巧来替代开销更大的算术运算。

XOR(异或)有一些有趣的性质:一个值与自身异或结果恒为 0(`a ^ a = 0`),与 0 异或则结果保持原值不变(`a ^ 0 = a`)。利用这两条性质,可以在不使用临时变量的情况下交换两个变量的值,这就是经典的“异或交换法”(`a ^= b; b ^= a; a ^= b;`)。出于可读性考虑,现代实际项目中已不太推荐使用,但它至今仍是理解位运算特性的经典教学示例。

位掩码在实际系统中应用广泛。Unix 文件权限(读=4、写=2、执行=1)本质上就是位运算的 OR 与 AND;从颜色代码 `#FF0000` 中提取红、绿、蓝各分量,也是通过右移配合 AND 掩码实现的。将多个开关状态压缩进一个整数中管理的“位标志”技巧,也曾在内存有限的旧游戏和系统编程中被广泛使用。