>>> import z3
>>> X = z3.BitVec('X', 32)
>>> z3.prove( X^18 == ((X|(~44)) & (X^62)) + (X&44) )
proved
x^18等价于((x|(~44))&(x^62))+(x&44) ??
这怎么可能?
我想知道关于证明这个公式的详细信息......
>>> import z3
>>> X = z3.BitVec('X', 32)
>>> z3.prove( X^18 == ((X|(~44)) & (X^62)) + (X&44) )
proved
x^18等价于((x|(~44))&(x^62))+(x&44) ??
这怎么可能?
我想知道关于证明这个公式的详细信息......
您可以将(中间)位向量显示为每个 8 位的符号集:
| X | x7 | x6 | x5 | x4 | x3 | x2 | x1 | x0 |
| 44 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 |
| ~44 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | 1 |
| X|(~44) | 1 | 1 | x5 | 1 | x3 | x2 | 1 | 1 |
| 62 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 |
| X^62 | x7 | x6 | !x5 | !x4 | !x3 | !x2 | !x1 | x0 |
| (X|(~44))&(X^62) | x7 | x6 | 0 | !x4 | 0 | 0 | !x1 | x0 |
| X&44 | 0 | 0 | x5 | 0 | x3 | x2 | 0 | 0 |
| (X|(~44))&(X^62)+(X&44) | x7 | x6 | x5 | !x4 | x3 | x2 | !x1 | x0 |
| X^18 | x7 | x6 | x5 | !x4 | x3 | x2 | !x1 | x0 |
六位就足够了,因为 62 可以用六位来表示。
加法步骤不能产生进位位,因为所有对应的位对都有一个零位。其他操作仅具有按位效果。因此,可以逐位分析等效位位置。
最后两个表行表明表达式实际上是等价的。