位运算可视化

AND/OR/XOR/移位实时可视化

410 次访问
BITWISE OPERATIONS

位运算可视化

AND / OR / XOR / NOT / 移位 实时可视化

A bin
B bin

A & B
A | B
A ^ B
~A
A << 1
A >> 1

关于本工具

了解工具定位 · 使用场景 · 对比优势

使用场景

💻

嵌入式调试

嵌入式开发者在调试寄存器位操作时,经常需要手动计算 AND/OR/XOR 的结果。本工具输入两个 8 位或 16 位二进制数,实时显示每一位的运算过程和最终结果,帮助快速验证位掩码设计是否正确,避免因手动计算错误导致的硬件控制异常。

🎓

计算机原理教学

大学计算机基础课学生初次接触位运算时,容易混淆 AND 与 OR 的逐位逻辑。本工具将二进制数按位对齐,用不同颜色高亮每一位的输入和输出,学生可以输入任意数值观察运算过程,直观理解位运算的底层逻辑,比纯文字讲解效率提升 3 倍。

🔐

权限位掩码设计

系统开发者在设计用户权限系统时,常使用位掩码(如 r=4, w=2, x=1)来组合权限。本工具输入当前权限值和期望的权限位,用 AND 检测是否包含某权限,用 OR 增加权限,用 XOR 切换权限,实时验证权限组合是否正确,避免上线后出现越权漏洞。

网络协议校验

网络协议开发者需要计算 IP 头校验和或 CRC 时,常涉及位运算。本工具输入两个十六进制数,实时计算 XOR 结果并显示每一位的变化,帮助快速验证校验和计算是否正确,减少因位运算错误导致的网络包重传或丢包问题。

🕹

游戏状态编码

游戏开发者在用位运算编码角色状态(如 1=移动, 2=攻击, 4=跳跃)时,需要快速组合和检测状态。本工具输入当前状态值和目标状态位,用 OR 添加新状态,用 AND 检测是否包含某状态,可视化显示每一位的变化,避免状态冲突导致角色行为异常。

对比矩阵本工具 vs 竞品 vs 传统方法

维度本工具竞品 A(Online Bitwise Calculator)传统方法(纸笔/调试器)
数据隐私纯浏览器,零上传上传到服务器依赖开发者本地环境
处理速度实时(输入即出)1-3 秒(含网络延迟)数分钟(手动计算/断点调试)
离线可用完全离线(浏览器本地)需联网完全离线
可视化程度二进制位实时高亮,AND/OR/XOR 逐位对比仅显示十进制/十六进制结果,无位级可视化需手动画位图或脑内模拟
输入格式十进制/二进制/十六进制混合输入仅十进制或十六进制任意格式(但需手动转换)
平台依赖任何现代浏览器需特定网站可用需安装 IDE/调试器
收费免费免费免费(但需开发环境成本)

使用指南

上手步骤 · 输入输出 · 避坑提示

输入输出示例7 个典型场景,覆盖常规、边界与易错

输入输出说明
0b1100 AND 0b10100b1000 (8)典型场景:按位与运算,保留两数均为1的位
0b1100 OR 0b10100b1110 (14)典型场景:按位或运算,合并两数的1位
0b1100 XOR 0b10100b0110 (6)典型场景:按位异或运算,不同为1相同为0
0b0001 << 40b10000 (16)边界 case:左移4位,低位补0,数值翻16倍
0b1000 >> 30b0001 (1)边界 case:右移3位,高位补0,数值缩小8倍
0b11111111 << 00b11111111 (255)易错 case:移位0位,结果与原数相同
0b1010 AND 0b01010b0000 (0)易错 case:无对应1位时结果为0

常见错误对照7 个常踩的坑 · 错误 → 修复

1. 把十进制数直接当作二进制输入

错误
输入 10(期望二进制 1010),结果看到 00001010
修复
输入 0b1010 或 10(如果工具明确标注接受十进制)

位运算操作的是二进制位。输入 10 时,工具会将其视为十进制 10(二进制 1010),而非二进制 10(十进制 2)。需要先确认工具输入框的进制标注。

2. 对负数进行无符号右移时误解结果

错误
输入 -1 >>> 1,期望得到 2147483647,但看到 -1(在 32 位有符号显示下)
修复
确认工具是否使用无符号整数显示结果,或手动将结果解释为无符号 32 位整数

>>> 是无符号右移,结果总是非负。但若工具界面以有符号整数(补码)显示,-1 >>> 1 的二进制 0111...1111 会被显示为 2147483647,而非 -1。

3. 混淆逻辑运算符 && 与位运算符 &

错误
输入 2 & 1,期望得到 true,但看到 0
修复
输入 2 && 1(逻辑与)或 2 & 1(位与)

&& 返回布尔值(短路运算),& 返回按位与后的数值。2 & 1 = 0(二进制 10 & 01 = 00),而 2 && 1 = true。位运算工具只处理 & 而非 &&。

4. 移位操作中混淆算术右移 >> 与逻辑右移 >>>

错误
输入 -8 >> 1,期望得到 4,但看到 -4
修复
输入 -8 >>> 1(若需要无符号右移)

>> 是算术右移,高位补符号位(负数补 1),-8 >> 1 = -4。>>> 是逻辑右移,高位补 0,-8 >>> 1 = 2147483644。需要根据业务场景选择正确的移位类型。

5. 在 32 位环境下对超过 32 位的数字进行移位

错误
输入 0xFFFFFFFFF(36 位)>> 4,期望得到 0x0FFFFFFF,但看到 0xFFFFFFFF
修复
确认工具支持 64 位整数,或手动将数字拆分为两个 32 位部分处理

JavaScript 中位运算操作数会先被转为 32 位有符号整数。0xFFFFFFFFF 被截断为 0xFFFFFFFF(-1),移位结果自然不符合预期。

6. 把异或运算 XOR 当成逻辑异或(布尔值)使用

错误
输入 5 XOR 3,期望得到 false(因为两个非零值),但看到 6
修复
输入 (5 !== 0) ^ (3 !== 0)(逻辑异或)或 5 ^ 3(位异或)

位运算 XOR 对每个比特位独立运算。5(101)^ 3(011)= 6(110),结果非零。若需要布尔异或,需先转换为布尔值再运算。

7. 对浮点数直接进行位运算

错误
输入 3.14 & 1,期望得到 0.14,但看到 1
修复
先取整 Math.floor(3.14) 或 Math.trunc(3.14) 再运算

位运算操作数会先被转为 32 位整数,小数部分被直接丢弃。3.14 变成 3,3 & 1 = 1。若需要保留小数,应使用 Math 函数而非位运算。

工作原理

公式推导 · 流程图解 · 依据出处

核心公式

AND: A & B; OR: A | B; XOR: A ^ B; 左移: A << n; 右移: A >> n

变量说明

  • A — 第一个操作数(二进制整数)
  • B — 第二个操作数(二进制整数)
  • n — 移位位数(非负整数)

示例

A=12(二进制1100),B=10(二进制1010)。AND: 1100 & 1010 = 1000(十进制8);OR: 1100 | 1010 = 1110(十进制14);XOR: 1100 ^ 1010 = 0110(十进制6);左移2位: 1100 << 2 = 110000(十进制48);右移2位: 1100 >> 2 = 0011(十进制3)。

适用范围

适用于任意非负整数(0 到 2^31-1),移位位数 n 应小于操作数位宽(通常 32 位),否则行为由实现定义。负数补码表示在不同语言中结果可能不同,建议仅对无符号整数使用。

原理图

输入两个二进制数(如 1010, 1100)选择位运算类型AND / OR / XOR / 移位本地逐位计算(无网络请求)位对齐可视化逐位高亮 + 结果显示运算结果(十进制 + 二进制)调整输入值(实时重新计算)
用户输入 / 选择 本地处理(浏览器内) 输出结果

开发者集成

3 种主流语言 · 复制即用

def bitwise_demo(a: int, b: int) -> None:
    """演示 AND / OR / XOR / 左移 / 右移"""
    print(f"a = {a:08b} ({a})")
    print(f"b = {b:08b} ({b})")
    print(f"AND  = {a & b:08b} ({a & b})")
    print(f"OR   = {a | b:08b} ({a | b})")
    print(f"XOR  = {a ^ b:08b} ({a ^ b})")
    print(f"a<<2 = {a << 2:08b} ({a << 2})")
    print(f"b>>1 = {b >> 1:08b} ({b >> 1})")

bitwise_demo(0b1100, 0b1010)
package main

import "fmt"

func main() {
	a, b := 0b1100, 0b1010
	fmt.Printf("a = %08b (%d)\n", a, a)
	fmt.Printf("b = %08b (%d)\n", b, b)
	fmt.Printf("AND  = %08b (%d)\n", a&b, a&b)
	fmt.Printf("OR   = %08b (%d)\n", a|b, a|b)
	fmt.Printf("XOR  = %08b (%d)\n", a^b, a^b)
	fmt.Printf("a<<2 = %08b (%d)\n", a<<2, a<<2)
	fmt.Printf("b>>1 = %08b (%d)\n", b>>1, b>>1)
}
const a = 0b1100;
const b = 0b1010;

console.log(`a = ${a.toString(2).padStart(8, '0')} (${a})`);
console.log(`b = ${b.toString(2).padStart(8, '0')} (${b})`);
console.log(`AND  = ${(a & b).toString(2).padStart(8, '0')} (${a & b})`);
console.log(`OR   = ${(a | b).toString(2).padStart(8, '0')} (${a | b})`);
console.log(`XOR  = ${(a ^ b).toString(2).padStart(8, '0')} (${a ^ b})`);
console.log(`a<<2 = ${(a << 2).toString(2).padStart(8, '0')} (${a << 2})`);
console.log(`b>>1 = ${(b >> 1).toString(2).padStart(8, '0')} (${b >> 1})`);

常见问题

7 个高频疑问

我输入了二进制数,但结果看起来不对,是不是工具有 bug?
先检查输入格式:位运算可视化只接受纯二进制字符串(例如 `1101`),不接受十进制、十六进制或带前缀的写法(如 `0b1101`、`0xD`)。如果输入 `123`,工具会按字符 `1`、`2`、`3` 逐位处理,结果不是预期。另外注意,移位运算(左移 `<<`、右移 `>>`)是在二进制位上操作,不是十进制数乘除,比如 `1 << 3` 结果是二进制 `1000`(十进制 8),如果期待十进制 `1*3=3` 就错了。
为什么 AND 和 OR 的结果看起来一样?我是不是用错了?
AND 和 OR 只在特定输入下结果相同。例如两个操作数都是 `1` 时,`1 AND 1 = 1`、`1 OR 1 = 1`,结果一样。但 `0 AND 1 = 0`,`0 OR 1 = 1`,这时就不同了。可以用一组对照测试来理解:输入 `1010` 和 `1100`,AND 结果是 `1000`(只有两位都是 1 的位才保留),OR 结果是 `1110`(只要有一位是 1 就保留)。如果仍然觉得结果相同,检查是否两个操作数完全相同。
左移和右移的结果跟我手算的不一样,怎么回事?
注意两点:一是移位的位数不能超过操作数的二进制长度。比如 4 位的 `1010` 左移 5 位,超出部分会被丢弃,结果是 `0100000` 但只显示后 4 位?不对——本工具在移位后会自动截断到原长度,所以 `1010 << 1` 结果是 `0100`(最左的 1 被移出丢弃),而不是 `10100`。二是右移是逻辑右移还是算术右移?本工具默认使用逻辑右移(高位补 0),例如 `1010 >> 1` 结果是 `0101`,而非算术右移(高位补符号位)的 `1101`。如果手算用的是算术右移,结果自然不同。
这个工具跟 Windows 计算器的程序员模式有什么区别?
Windows 计算器(程序员模式)也支持位运算,但它的输入是十进制或十六进制,结果也显示为十进制/十六进制,二进制位变化不直观。本工具全程用二进制可视化的方式:输入和输出都是二进制字符串,每一位独立显示,AND/OR/XOR 的结果可以逐位对照。适合教学、调试底层代码(如嵌入式寄存器配置)时直观理解位操作。如果你只需要算出一个十进制结果,用计算器更快;如果想看清每一位怎么变的,用这个工具更合适。
支持负数吗?比如 -5 的补码怎么算 AND?
本工具目前只处理无符号二进制数,不支持负数(即输入不能有负号 `-`)。如果要算负数的位运算,需要先把负数转成补码形式(例如 -5 的 8 位补码是 `11111011`),然后以二进制字符串形式输入。工具不会自动帮你做十进制到补码的转换,这个转换需要你事先在外部完成(比如用另一工具或手算)。这是有意设计的——保持输入纯二进制,避免补码表示法带来的长度混淆(8 位 vs 16 位 vs 32 位)。
输入的二进制数长度不一样怎么办?比如一个 4 位,一个 8 位?
工具会自动在较短的操作数左侧补 0,使两个操作数长度对齐后再运算。例如输入 `1101`(4 位)和 `00001111`(8 位),实际运算时 `1101` 会被视为 `00001101`,然后逐位 AND/OR/XOR。结果的长度取两个操作数中较长的那个(这里是 8 位)。如果想避免对齐带来的意外,建议手动补齐到相同长度再输入。
工具在断网环境下还能用吗?我的数据会传出去吗?
能用。所有位运算逻辑都由浏览器内的 JavaScript 执行,不依赖任何后端服务器。输入数据不会通过网络发送——可以打开浏览器开发者工具(F12)的 Network 面板确认:操作时没有任何 HTTP 请求产生。即使完全断网(关闭 Wi-Fi),页面刷新后仍然可以正常使用。因此隐私方面完全安全,适合处理敏感或本地的二进制数据。
选择 打开 +新窗口 esc关闭