簡體   English   中英

bitxor,求解方程,布爾邏輯

[英]bitxor, solve equation, boolean logic

我有等式:

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^b = A^b^b + (2*A)^b^b + (4*A)^b^b = A + 2*A + 4*A

然后

C^C^b = b = C^(A + 2*A + 4*A)

編輯只是為了確保:這個答案是不正確的 真可惜 我將不得不考慮更多。

我采用相同的假設: +*是加法和乘法,而忽略了溢出。

查找表

這可能是最快的解決方案:預計算結果,並將其存儲在查找表中。 這將需要2 16個字節的內存,即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的XOR(如果這條語句有點跳躍,我鼓勵您繪制一個真值表,而不僅僅是相信我!)。

說明

之所以起作用,是因為更改某個位只會影響該位的結果,而影響更高的位卻不會影響較低的位(因為當您用筆和紙相加時,進位可能會傳播到左側)。 因此,在最壞的情況下,算法需要進行2次猜測才能獲得最低有效位的正確性,對於第二個lsb進行另一個猜測,對於第三個lsb進行另一個猜測,依此類推,在給定ac任意組合的情況下最多進行9個猜測

這是我的測試程序的示例跟蹤:

a: 00001100
c: 01100111

Guess:  01100111
Result: 01000001
Guess:  01000001
Result: 00010111
Guess:  00110001
Result: 01100111

b: 00110001

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM