或运算无法还原原始值?已知a|b=c中a和c,如何求解b?
如何从
a | b = c(已知a和c)推导b的可能值? 先明确一个核心点:或运算(OR)是不可逆的——只靠a和c,你没办法得到唯一的b,只能确定b每一位的取值规则,进而得到所有符合条件的b。
先回顾下二进制或运算的单比特规则:
对于每一对对应比特位a_bit和b_bit,结果c_bit满足:
0 | 0 = 00 | 1 = 11 | 0 = 11 | 1 = 1
基于这个规则,我们可以逐位推导b的比特位限制:
逐位推导规则
- 当
c的某一位是0时:
因为只有0 | 0 = 0,所以a的这一位必须是0(否则如果a是1,不管b是什么,结果都是1,和c的0矛盾),同时b的这一位必须是0。 - 当
c的某一位是1时:
分两种子情况:- 如果
a的这一位是1:不管b是0还是1,结果都是1,所以b的这一位可以是0或1(两种可能)。 - 如果
a的这一位是0:只有0 | 1 = 1,所以b的这一位必须是1。
- 如果
用你的例子验证
已知a = 0011(二进制),c = 0111(二进制),我们把四位从左到右编号分析:
| 位序号 | a的比特 | c的比特 | b的比特规则 | 可能取值 |
|---|---|---|---|---|
| 1 | 0 | 0 | 必须为0 | 0 |
| 2 | 0 | 1 | 必须为1 | 1 |
| 3 | 1 | 1 | 0或1均可 | 0/1 |
| 4 | 1 | 1 | 0或1均可 | 0/1 |
所以b的所有可能值是:
- 0100
- 0101(就是你例子里的结果)
- 0110
- 0111
这些值和a=0011做或运算,结果都会是0111。
总结
如果用位运算表达式概括b的取值范围:b必须满足 (b & (~a)) == (c & (~a)),同时 (b & a) 可以是任意值(因为a的1位和b做或运算不影响结果)。换个更直白的说法:
b在a为0的那些位上,必须和c的对应位完全相同;b在a为1的那些位上,可以自由取0或1。
内容的提问来源于stack exchange,提问作者xxking
相关产品推荐
相关产品推荐

