二元方程

Binary equation

我有一个任务: 0x430 = ((0x0f0f)^x) << 4) & 0xc35

十进制: 1072 = ((3855^x)<<4 & 3125)

和二进制: 10000110000 = (111100001111^x)<<4 & 110000110101

所以第一步应该是 110000110101 到左边。我应该使用 or 而不是 and (&)?

& 操作,假设您指的是按位与,是一种丢失信息的操作。与 0“与”的位中包含的所有信息都将丢失。这就像与 0 相乘。与 0 相乘没有等效的“逆”运算,如果将其应用于等式两边,则在右侧将其删除并在左侧进行一些更改。

所以我认为你的双方等价操作的方法在这里不适用。

因此,我建议为那些因与 0 相加而丢失的位引入不同的表示。例如"#".

这会导致

10000110000 = (111100001111^x)<<4 & 110000110101
  =>
1####11#0#0 = (111100001111^x)<<4

即你只能确定未知“x”的一些位。

所以以下不是最聪明但可行的解决方案:

public class Main {
    public static void main(String[] args){
        for (int i = 0; i < Integer.MAX_VALUE; i++){
            if((((3855^i) << 4) & 3125) == 1072){
                System.out.println("Found: " + i);
                break;
            }
        }
    }
}

/*
checking:
left side:
((111100001111 ^ 1000000) << 4) & 110000110101

       111100001111
XOR    000001000000
       111101001111

111101001111 << 4 = 1111010011110000


          1111010011110000
AND       0000110000110101
          0000010000110000


right side: 10000110000

right: 0000010000110000
left:       10000110000
 */

正如我们所见,64 是第一个大于 0 的整数,它求解了这个方程。当然还有更多的作品。