无需登录 数据私有 本地保存

按位运算可视化 - AND/OR/XOR/NOT实时

13
0
0
0
0xAA
0x66
A=1 A=0 B=1 B=0 AND 结果=1 OR 结果=1 XOR 结果=1 NOT 结果=1
按位可视化 · 点击操作数位可翻转
位索引
A
170 0xAA
B
102 0x66

AND
34 0x22
OR
238 0xEE
XOR
204 0xCC
NOT ~A
85 0x55
NOT ~B
153 0x99
A & B
都为1才得1 清零/掩码提取
A | B
有1即得1 置位/合并标志
A ^ B
不同得1相同得0 翻转/加密/校验
~A
全部位取反 补码/取反操作
位运算常见问题

按位与(AND)运算对两个数的每一位执行逻辑与操作:两个位都为1时,结果位才为1;否则为0。实际应用包括:
掩码提取:用AND提取特定位,如 value & 0xFF 提取低8位
清零操作:将指定位清零,如 flags & ~(1<<3) 清除第3位
权限检查:检查某个标志位是否置位,如 if (permissions & READ_FLAG)
取模运算:对2的幂取模,如 n & (16-1) 等价于 n % 16,但更快

异或(XOR)的特点是相同为0,不同为1。它有一些非常独特的数学性质:
自反性a ^ a = 0,任何数与自身异或得0
恒等性a ^ 0 = a,与0异或保持不变
交换律和结合律a ^ b = b ^ a(a ^ b) ^ c = a ^ (b ^ c)
无需临时变量交换两数a ^= b; b ^= a; a ^= b;
简单加密密文 = 明文 ^ 密钥,解密用相同密钥再异或
奇偶校验:检测数据传输中的错误

NOT(按位取反)的结果取决于位宽,因为取反是针对固定位数进行的:
8位~0b00001100 = 0b11110011(十进制243)
16位~0b00000000_00001100 = 0b11111111_11110011(十进制65523)
32位:结果更大,因为高位全部变为1
这就是为什么在编程中需要注意数据类型的位宽。JavaScript中~运算符默认对32位有符号整数操作,使用>>>0可转为无符号。

虽然符号相似,但位运算和逻辑运算有本质区别
位运算(&, |, ^, ~):逐位操作,返回数字。如 5 & 3 = 1
逻辑运算(&&, ||, !):操作真值,返回布尔值。如 true && false = false
短路求值:逻辑运算有短路特性(&&左边为false则不执行右边),位运算没有
常见错误:用&代替&&可能导致意外结果,因为&不短路且返回数字

位运算直接由CPU的位操作指令执行,通常只需1个时钟周期,而乘除可能需要多个周期:
乘除2的幂n << 3(乘8)比 n * 8
图形/图像处理:像素颜色混合、Alpha通道操作
嵌入式系统:寄存器配置、GPIO控制
加密算法:AES、DES等大量使用位运算
哈希/校验:CRC、MD5等
游戏开发:碰撞检测、状态标志管理
现代编译器会自动优化,但手动使用位运算仍能提高代码效率。