我们不难发现:
a=7
b=8
c=a|b
然后c
结果是:15
现在我们可以找到a
吗?如果c
给定了吗?
例如:
b=8
c=15
c=a|b
找到一个?
还有如果 x=2<<1
给出,那么我们可以得到x=4
.但是如果 4=y<<1
给出我们能得到y
吗? ?
最佳答案
首先,这些只是我的观察,我没有任何来源来支持它们。有更好的方法,但维基百科页面真的很长而且令人困惑,所以我把这个方法拼凑在一起。
是的,你可以,但你需要更多的上下文(引用其他方程求解)和更多的解析。这是我想出的方法,但是有更好的方法来解决这个问题。这对我来说在概念上更容易。
数字
您不能只将一个整数放入一个方程式中并让它起作用。按位运算符仅指 bool 值,我们只是将它们视为整数。为了简化方程式,我们必须将其视为 bool 数组。
以无符号 8 位整数为例:
a = 0b10111001
现在变成:
a = {1, 0, 1, 1, 1, 0, 0, 1}
解析
一旦你可以将你的方程式变成 bool 值,那么你就可以将实际的按位运算符应用于简单的 1 和 0。但是现在您可以更进一步,此时所有按位方程都可以用 AND
、OR
和 NOT
来编写。加减乘法也可以这样表示,但是需要自己手动写出所采取的步骤。
A ^ B = ~( ( A & B ) | ( (~A) & (~B) ) )
这包括位移,但它们不是扩展到其他位运算符,而是充当赋值。
A = 0b10111001
B = 0b10100110
C = (A >> 2) ^ B
然后这会扩展为 8 个等式,每个等式一个。
C[0] = A[2] ^ B[0]
C[1] = A[3] ^ B[1]
C[2] = A[4] ^ B[2]
C[3] = A[5] ^ B[3]
C[4] = A[6] ^ B[4]
C[5] = A[7] ^ B[5]
C[6] = 0 ^ B[6]
C[7] = 0 ^ B[7]
C[6]
和 C[7]
可以简化为 B[6]
和 B[7 ]
分别。
代数
现在您有了一个仅由 AND
、OR
和 NOT
组成的方程,您可以使用传统代数来表示它们。在这一步中,它们不再被视为位,而是恰好为 0 或 1 的实数。
A | B => A + B - AB
A & B => AB
~A => 1 - A
请注意,当插入 1 和 0 时,所有这些都保持为真。
对于此示例,我将使用多数函数作为示例。它的工作是接收三位并在 1 多于 0 时返回 1。
定义为:
f(a, b, c) = ((a & b) | (a & c) | (b & c))
变成
f(a, b, c) = (ab + ac - (ab * ac)) + bc - (ab + ac - (ab * ac) * bc
f(a, b, c) = ab + ac + bc - a2bc - ab2c - abc2 + a2b2c2
既然您已经掌握了这些信息,您就可以使用标准代数轻松地将它与其他方程式结合起来以获得解决方案。任何非 1 或 0 的解决方案都是无关紧要的。
关于python - 是否可以求解按位运算符的方程式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45651753/