位运算可视化
AND / OR / XOR / NOT / 移位 实时可视化
AND/OR/XOR/移位实时可视化
AND / OR / XOR / NOT / 移位 实时可视化
了解工具定位 · 使用场景 · 对比优势
嵌入式开发者在调试寄存器位操作时,经常需要手动计算 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 检测是否包含某状态,可视化显示每一位的变化,避免状态冲突导致角色行为异常。
| 维度 | 本工具 | 竞品 A(Online Bitwise Calculator) | 传统方法(纸笔/调试器) |
|---|---|---|---|
| 数据隐私 | 纯浏览器,零上传 | 上传到服务器 | 依赖开发者本地环境 |
| 处理速度 | 实时(输入即出) | 1-3 秒(含网络延迟) | 数分钟(手动计算/断点调试) |
| 离线可用 | 完全离线(浏览器本地) | 需联网 | 完全离线 |
| 可视化程度 | 二进制位实时高亮,AND/OR/XOR 逐位对比 | 仅显示十进制/十六进制结果,无位级可视化 | 需手动画位图或脑内模拟 |
| 输入格式 | 十进制/二进制/十六进制混合输入 | 仅十进制或十六进制 | 任意格式(但需手动转换) |
| 平台依赖 | 任何现代浏览器 | 需特定网站可用 | 需安装 IDE/调试器 |
| 收费 | 免费 | 免费 | 免费(但需开发环境成本) |
上手步骤 · 输入输出 · 避坑提示
| 输入 | 输出 | 说明 |
|---|---|---|
| 0b1100 AND 0b1010 | 0b1000 (8) | 典型场景:按位与运算,保留两数均为1的位 |
| 0b1100 OR 0b1010 | 0b1110 (14) | 典型场景:按位或运算,合并两数的1位 |
| 0b1100 XOR 0b1010 | 0b0110 (6) | 典型场景:按位异或运算,不同为1相同为0 |
| 0b0001 << 4 | 0b10000 (16) | 边界 case:左移4位,低位补0,数值翻16倍 |
| 0b1000 >> 3 | 0b0001 (1) | 边界 case:右移3位,高位补0,数值缩小8倍 |
| 0b11111111 << 0 | 0b11111111 (255) | 易错 case:移位0位,结果与原数相同 |
| 0b1010 AND 0b0101 | 0b0000 (0) | 易错 case:无对应1位时结果为0 |
输入 10(期望二进制 1010),结果看到 00001010输入 0b1010 或 10(如果工具明确标注接受十进制)位运算操作的是二进制位。输入 10 时,工具会将其视为十进制 10(二进制 1010),而非二进制 10(十进制 2)。需要先确认工具输入框的进制标注。
输入 -1 >>> 1,期望得到 2147483647,但看到 -1(在 32 位有符号显示下)确认工具是否使用无符号整数显示结果,或手动将结果解释为无符号 32 位整数>>> 是无符号右移,结果总是非负。但若工具界面以有符号整数(补码)显示,-1 >>> 1 的二进制 0111...1111 会被显示为 2147483647,而非 -1。
输入 2 & 1,期望得到 true,但看到 0输入 2 && 1(逻辑与)或 2 & 1(位与)&& 返回布尔值(短路运算),& 返回按位与后的数值。2 & 1 = 0(二进制 10 & 01 = 00),而 2 && 1 = true。位运算工具只处理 & 而非 &&。
输入 -8 >> 1,期望得到 4,但看到 -4输入 -8 >>> 1(若需要无符号右移)>> 是算术右移,高位补符号位(负数补 1),-8 >> 1 = -4。>>> 是逻辑右移,高位补 0,-8 >>> 1 = 2147483644。需要根据业务场景选择正确的移位类型。
输入 0xFFFFFFFFF(36 位)>> 4,期望得到 0x0FFFFFFF,但看到 0xFFFFFFFF确认工具支持 64 位整数,或手动将数字拆分为两个 32 位部分处理JavaScript 中位运算操作数会先被转为 32 位有符号整数。0xFFFFFFFFF 被截断为 0xFFFFFFFF(-1),移位结果自然不符合预期。
输入 5 XOR 3,期望得到 false(因为两个非零值),但看到 6输入 (5 !== 0) ^ (3 !== 0)(逻辑异或)或 5 ^ 3(位异或)位运算 XOR 对每个比特位独立运算。5(101)^ 3(011)= 6(110),结果非零。若需要布尔异或,需先转换为布尔值再运算。
输入 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 位),否则行为由实现定义。负数补码表示在不同语言中结果可能不同,建议仅对无符号整数使用。
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 个高频疑问
「硬件 / 嵌入」下的其他工具