位运算模拟器(AND、OR、XOR、NOT、移位)
对两个数值计算 AND、OR、XOR、NOT、左移、右移,并通过二进制网格直观展示每一位的变化。支持 8/16/32 位宽。
使用提示
- 数值不仅可以输入十进制,还可以使用 `0x1A` 形式的十六进制或 `0b1010` 形式的二进制前缀,直接照抄代码中的写法即可。
- AND、OR、XOR 需要两个数值,NOT 只需要一个数值。切换运算类型时,输入框数量会自动调整。
- 右移(`>>>`)本工具只支持逻辑移位。它与保留符号位的算术移位有何不同,请参见下方常见问题。
- 将位宽从 8 位切换到 16 位、32 位,可以直观看到同一个数值的高位会补上更多的 0,有助于理解“位宽”的真正含义。
- 黄色高亮的位表示演算前后发生变化的位。使用 AND、OR 时,可以直观追踪哪个输入值在每一位上“胜出”。
常见问题
有区别。逻辑移位(`>>>`)始终用 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 掩码实现的。将多个开关状态压缩进一个整数中管理的“位标志”技巧,也曾在内存有限的旧游戏和系统编程中被广泛使用。