Math 位异或,解方程,布尔逻辑
我有一个等式:Math 位异或,解方程,布尔逻辑,math,logic,bit-manipulation,equation,Math,Logic,Bit Manipulation,Equation,我有一个等式: C = A^b + (2*A)^b + (4*A)^b. 其中C和A已知,但b未知。如何找到b? 所有数字都是8位字节。有没有比暴力更快的方法?符号+是否表示字节加法和*多重处理,溢出位被丢弃?如果是的话,我想答案是 b = C ^ (A + 2 * A + 4* A) 如何得出这一结论: C = A^b + (2*A)^b + (4*A)^b 因此 然后 编辑以确保:此答案不正确。我真丢脸。我得多考虑一下 我采用相同的假设:+和*是忽略溢出的加法和乘法 查表 这可能是
C = A^b + (2*A)^b + (4*A)^b.
其中C和A已知,但b未知。如何找到b?
所有数字都是8位字节。有没有比暴力更快的方法?符号+是否表示字节加法和*多重处理,溢出位被丢弃?如果是的话,我想答案是
b = C ^ (A + 2 * A + 4* A)
如何得出这一结论:
C = A^b + (2*A)^b + (4*A)^b
因此
然后
编辑以确保:此答案不正确。我真丢脸。我得多考虑一下 我采用相同的假设:+
和*
是忽略溢出的加法和乘法
查表
这可能是最快的解决方案:预计算结果,并将其存储在查找表中。它需要216字节的内存,即64 kB
猜测、检查、改进方法
以类C族伪代码表示:
byte Solve(byte a, byte c){
byte guess = lastGuess = result = lastResult = 0;
do {
guess = lastGuess ^ lastResult ^ c; //see explanation below
result = a^guess + (2*a)^guess + (4*a)^guess;
lastGuess = guess;
lastResult = result;
} while (result != c);
return guess;
}
该算法的思想是,它猜测b
是什么,然后将其插入公式中以获得一个暂定结果,并将其与c
进行对比检查。猜测中导致结果与c
不同的任何位都将更改。这对应于最后一个猜测、最后一个结果和c
的异或(如果这个语句有点跳跃,我建议您绘制一个真值表,而不仅仅是相信我的话!)
解释
这是因为更改位只会影响该位的结果,以及更重要的位,而不会影响较低的位(因为当您使用笔和纸进行加法时,进位可能会传播到左侧)。因此,在最坏的情况下,算法需要两次猜测以获得最低有效位正确,第二个lsb需要另一次猜测,第三个lsb需要另一次猜测,等等。如果a
和c
的任意组合,则最多需要9次猜测
下面是我的测试程序中的跟踪示例:
a: 00001100
c: 01100111
Guess: 01100111
Result: 01000001
Guess: 01000001
Result: 00010111
Guess: 00110001
Result: 01100111
b: 00110001
那么“*”应该是什么?整数乘法?第一步是不正确的,XOR不分布在二进制加法上。例如,以A=0x00,C=0x01为例,实际答案是b=0xAB。@DPenner:你说得对。胡扯!我想我已经检查过了,但显然还不够好。
byte Solve(byte a, byte c){
byte guess = lastGuess = result = lastResult = 0;
do {
guess = lastGuess ^ lastResult ^ c; //see explanation below
result = a^guess + (2*a)^guess + (4*a)^guess;
lastGuess = guess;
lastResult = result;
} while (result != c);
return guess;
}
a: 00001100
c: 01100111
Guess: 01100111
Result: 01000001
Guess: 01000001
Result: 00010111
Guess: 00110001
Result: 01100111
b: 00110001