CCalculate.Studio

💾 位运算计算器

位运算直接作用于一个数二进制表示中的每一个二进制位(比特),而不是把这个数当作一个整体的十进制值来处理。本计算器对非负的 32 位整数执行六种标准位运算——与、或、异或、非、左移和右移——并显示输入数和结果的二进制表示。

最后审核: 2026-07-07
Add as preferred on Google

如何理解位运算真值表

每种逻辑位运算都遵循固定的真值表,独立应用于每一对对应位置的比特。

比特 A比特 B异或
00000
01011
10011
11110
  • 本计算器把输入限制在有符号 32 位整数的范围内(0 到 2,147,483,647),因为按照 ECMAScript 规范,JavaScript 的位运算符在内部运算之前会先把数值转换为 32 位表示。
  • 非运算(~A)的结果,按有符号 32 位整数解释时,总是等于 −(A + 1)——本计算器显示的是无符号 32 位等价值(例如 ~12 显示为 4,294,967,283,而不是 −13),这样所展示的二进制表示就不会产生歧义。
  • 移位位数(B)超过 31 时,本计算器会将其限制为 31,因为在 JavaScript 中,对一个 32 位数值移动 32 位或更多位数时会发生「环绕」(只使用移位位数的低 5 位),而不是像直觉预期的那样得到 0。

什么是位运算?

位运算是在一个数的各个二进制位(比特)层面上处理数据,比较或移动其二进制表示中的 0 和 1,而不是执行普通的十进制算术运算。任何整数都可以写成一串二进制位,每一位对应 2 的某个幂次——例如,12 的二进制是 1100,表示 1×8 + 1×4 + 0×2 + 0×1。

逻辑位运算——与(AND)、或(OR)、异或(XOR,即 exclusive or)和非(NOT)——按照标准的布尔逻辑规则,独立地对两个数对应位置上的比特进行比较(或对一个数的比特取反)。移位运算——左移和右移——把一个数的所有比特整体向左或向右移动指定的位数,这在数学上等价于乘以或除以 2 的某个幂次。

位运算是计算机科学和底层编程的基础:它们被用来设置、清除和检查一组选项中的各个标志位(位标志)、快速实现乘除 2 的幂次、用于密码学算法、用于图形和颜色处理(组合红/绿/蓝三个通道),以及紧凑的数据编码。

如何使用本位运算计算器

  1. 输入第一个数(A),为非负整数(0 到 2,147,483,647,即有符号 32 位整数的取值范围)。
  2. 输入第二个数(B)。对于与、或、异或运算,这是与 A 逐位比较的第二个操作数。对于移位运算,这是要移动的位数(0–31 有效,更大的值会被限制为 31)。对于非运算,B 会被忽略,因为非运算只对 A 本身进行操作。
  3. 选择运算方式:与、或、异或、非、左移或右移。
  4. 查看十进制结果,以及 A、B(或移位位数)和结果的二进制表示。

各种位运算的具体原理

与:只有当两个对应位都为 1 时,结果位才为 1
或:只要有一个对应位为 1,结果位就为 1
异或:只有当两个对应位中恰好一个为 1 时,结果位才为 1
左移:A << B = A × 2^B;右移:A >> B = ⌊A ÷ 2^B⌋
计算示例:12 AND 10 = 8;12 OR 10 = 14;12 XOR 10 = 6;12 << 2 = 48;12 >> 2 = 3

与运算比较每一个对应位置的比特,只有两者都是 1 时结果才为 1,否则为 0。举例说明:12(1100)与 10(1010)与运算得 8(1000),因为只有第三位(对应数值 8)在两个数中都是 1。

或运算比较每一个对应位置的比特,只要两者中至少有一个是 1,结果就是 1。举例说明:12(1100)或 10(1010)得 14(1110)。异或运算在两个对应比特恰好一个为 1(而不是都为 1)时结果为 1。举例说明:12(1100)异或 10(1010)得 6(0110)。

非运算把单个数的每一位都取反(0 变 1,1 变 0)。由于本计算器针对的是 32 位数值,非运算 12 会把全部 32 位都取反,如果按无符号 32 位整数解释,结果为 4,294,967,283(如果按有符号整数解释,则是 −13 的补码表示)。

左移(A << B)把 A 的每一位都向左移动 B 位,空出的低位用 0 填充——等价于把 A 乘以 2^B。举例说明:12 << 2 = 48(等价于 12 × 2² = 12 × 4 = 48)。右移(A >> B)把 A 的每一位都向右移动 B 位,丢弃低位——等价于用 A 除以 2^B 后向下取整。举例说明:12 >> 2 = 3(等价于 ⌊12 ÷ 4⌋ = 3)。

常见错误

  • 把按位与/或和逻辑(布尔)与/或混为一谈——按位运算符独立作用于一个数的每一位,而逻辑运算符把整个值当作单一的真/假条件来处理;除了 0 和 1 这种特殊情况外,两者结果并不相同。
  • 以为大幅度左移总会成比例地得到更大的数——移位幅度足够大时,有效位会被推到 32 位边界之外而被丢弃(溢出)。
  • 误读非运算的结果——由于非运算会把全部 32 位都取反,~A 的无符号十进制结果看起来比 A 本身大得多,尽管按有符号补码解释,它实际上表示的是一个较小的负数 −(A+1)。
  • 以为右移总是等价于普通除法——对非负整数而言,右移与除以 2 的幂次再向下取整的结果完全一致,但对负数而言,具体结果会因所用的是算术移位还是逻辑移位而不同。

常见问题

按位与和逻辑与有什么区别?

按位与(&)逐位比较两个数,只有当对应的两个输入位都为 1 时,结果对应位才为 1——例如 12 & 10 = 8。逻辑与(&&)把每个值整体当作单一的真/假条件,返回原操作数之一或布尔值,判断的是「真假」而不是逐位组合。这两个运算符用途不同,通常会得到差异很大的结果。

异或是怎么运算的?

异或(XOR)逐位比较两个数,在对应两个比特恰好一个为 1(既不是都为 1,也不是都为 0)的位置上,结果为 1。以 12(1100)异或 10(1010)为例:逐位比较得到 0110,十进制为 6。异或常用于翻转比特、检测两个值之间的差异,以及简单的校验和与奇偶校验计算。

左移是做什么的?

左移(A << B)把 A 二进制表示中的每一位都向左移动 B 位,新腾出的低位用 0 填充。这在数学上等价于把 A 乘以 2 的 B 次方。例如,12 << 2 = 48,与 12 × 2² = 12 × 4 = 48 结果相同。

按位非是做什么的?

按位非(~A)把 A 的每一位都取反——每个 0 变成 1,每个 1 变成 0。对 12 的 32 位表示(00000000000000000000000000001100)执行非运算,会把所有这些位都翻转,作为无符号 32 位数显示为 4,294,967,283,而作为有符号整数,按补码形式表示的是 −13(遵循恒等式 ~A = −(A+1))。

右移和除法有什么不同?

对非负整数而言,右移(A >> B)的结果与除以 2^B 后向下取整完全一致:A >> B = ⌊A ÷ 2^B⌋。例如,12 >> 2 = 3,与 ⌊12 ÷ 4⌋ = 3 相符。对负数而言,两种运算的结果可能不同,具体取决于所用的移位类型(算术移位还是逻辑移位)如何处理符号位——这是与底层编程相关的一个细节。

为什么这里的位运算限制在 32 位整数?

按照 ECMAScript 语言规范,JavaScript 内置的位运算符(&、|、^、~、<<、>>)在执行运算之前,会先把操作数在内部转换为 32 位整数。本计算器沿用了这一标准行为,因此输入被限制在 32 位所能表示的范围之内(对于这里所接受的非负值,即 0 到 2,147,483,647)。

参考文献

  1. Warren HS Jr. Hacker's Delight. 2nd ed. Addison-Wesley, 2012. (Standard reference for bitwise algorithms and two's-complement arithmetic.)
  2. ECMA International. ECMA-262: ECMAScript Language Specification, §6.1.6.1 (Bitwise operators, ToInt32/ToUint32). ecma-international.org.
  3. Patterson DA, Hennessy JL. Computer Organization and Design: The Hardware/Software Interface. 5th ed. Morgan Kaufmann, 2013. (Binary representation and bitwise logic.)

数论 · 全部计算器

相关计算器