是否可以求解按位运算符的方程式?
Is it possible to solve equations of bit wise operators?
我们不难发现:
a=7
b=8
c=a|b
那么c
就是:15
现在如果给定 c
我们可以找到 a
吗?
例如:
b=8
c=15
c=a|b
找到一个?
而且如果给出x=2<<1
,那么我们可以得到x=4
。但是如果给出 4=y<<1
我们可以得到 y
?
你可以找到一个解方程的 a
,但它不会是唯一的。假设 b=c=1
然后 a=0
和 a=1
是解决方案。对于 c=1, b=0
将没有解决方案。这对您考虑的数字中的所有位都有效。如果方程是可解的,a=c
将是(其中一个)解。
并且左移一个整数将始终得到偶数(最低有效位为零)。所以这只适用于 even itegers。在这种情况下,您可以通过应用右移 (>>
).
来反转操作
对于您的特定情况,答案是 否,您无法解决或 'undo' OR 运算 (|
) 并向左或向右移动(<<
, >>
) 因为在这两种情况下,应用操作都会丢失信息。例如,8|7=15
和12|7=15
,因此给定7
和15
是不可能得到唯一解的。
XOR 运算是一个例外,当 a^b=c
、b^c=a
和 a^c=b
.
时,它确实成立
如果您允许每个位具有三种状态,则可以考虑此类方程的解(如果存在)"unique":
- 位为0
- 位为1
- 无所谓X
例如7 | 00001XXX(binary) = 15
当然,这样的结果不能转化为小数。
对于某些操作,可能需要指定位宽。
首先,这些只是我的观察,我没有任何来源来支持它们。有更好的方法,但维基百科页面真的很长而且令人困惑,所以我把这个方法拼凑在一起。
是的,你可以,但你需要更多的context(参考其他方程求解)和更多的解析。这是我想出的方法,但是有更好的方法来解决这个问题。这对我来说在概念上更容易。
数字
您不能只将一个整数放入一个方程式并让它起作用。按位运算符仅指布尔值,我们只是将它们视为整数。为了简化方程式,我们必须将其视为布尔数组。
以无符号8位整数为例:
a = 0b10111001
现在变成:
a = {1, 0, 1, 1, 1, 0, 0, 1}
正在解析
一旦你可以将你的方程式变成布尔值,那么你就可以将实际的按位运算符应用于简单的 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 时,所有这些都保持为真。
对于此示例,我将使用多数函数作为示例。它的工作是接受三位和 return 1 如果 1 多于 0。
定义为:
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 的解决方案都是无关紧要的。
我们不难发现:
a=7
b=8
c=a|b
那么c
就是:15
现在如果给定 c
我们可以找到 a
吗?
例如:
b=8
c=15
c=a|b
找到一个?
而且如果给出x=2<<1
,那么我们可以得到x=4
。但是如果给出 4=y<<1
我们可以得到 y
?
你可以找到一个解方程的 a
,但它不会是唯一的。假设 b=c=1
然后 a=0
和 a=1
是解决方案。对于 c=1, b=0
将没有解决方案。这对您考虑的数字中的所有位都有效。如果方程是可解的,a=c
将是(其中一个)解。
并且左移一个整数将始终得到偶数(最低有效位为零)。所以这只适用于 even itegers。在这种情况下,您可以通过应用右移 (>>
).
对于您的特定情况,答案是 否,您无法解决或 'undo' OR 运算 (|
) 并向左或向右移动(<<
, >>
) 因为在这两种情况下,应用操作都会丢失信息。例如,8|7=15
和12|7=15
,因此给定7
和15
是不可能得到唯一解的。
XOR 运算是一个例外,当 a^b=c
、b^c=a
和 a^c=b
.
如果您允许每个位具有三种状态,则可以考虑此类方程的解(如果存在)"unique":
- 位为0
- 位为1
- 无所谓X
例如7 | 00001XXX(binary) = 15
当然,这样的结果不能转化为小数。
对于某些操作,可能需要指定位宽。
首先,这些只是我的观察,我没有任何来源来支持它们。有更好的方法,但维基百科页面真的很长而且令人困惑,所以我把这个方法拼凑在一起。
是的,你可以,但你需要更多的context(参考其他方程求解)和更多的解析。这是我想出的方法,但是有更好的方法来解决这个问题。这对我来说在概念上更容易。
数字
您不能只将一个整数放入一个方程式并让它起作用。按位运算符仅指布尔值,我们只是将它们视为整数。为了简化方程式,我们必须将其视为布尔数组。
以无符号8位整数为例:
a = 0b10111001
现在变成:
a = {1, 0, 1, 1, 1, 0, 0, 1}
正在解析
一旦你可以将你的方程式变成布尔值,那么你就可以将实际的按位运算符应用于简单的 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 时,所有这些都保持为真。
对于此示例,我将使用多数函数作为示例。它的工作是接受三位和 return 1 如果 1 多于 0。
定义为:
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 的解决方案都是无关紧要的。