3

这是以下算法:

int encryption(int a, int b) {
    short int c, c2;
    uint8_t d;

    c = a ^ b;
    c2 = c;

    d = 0;
    while(c) {
        c &= c - 1;
        d++;
    }

    return d;
}

如何找到我应该在该函数中发送哪个变量 a 和 b 来决定 d 的输出值?

换句话说,如果我想要 d=11,我该如何反转算法?

4

3 回答 3

1

d只是中的“1”位数c,请参阅http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetKernighan

因此,您只需要找到aandb使得它们的按位异或值正好有 11 位,例如a = 0and b = 2047

(这不是加密。这是一种非常弱的单向散列。加密必须提供一种方法来取回原始值(解密)。)

于 2010-04-10T09:00:05.063 回答
1

这:

while(c) {
    c &= c - 1;
    d++;
}

计算 中的 1 位的数量c。因此,例如,如果c = 10110, d 将为 3。

这:

c = a ^ b;

和之间的ab。这意味着在 和 中共享相同位置的所有 1 位都ab为零,并且在a和中具有不同值的所有位置都b将变为 1。例如:

101110 ^
011010
========
110100

所以基本上,该算法找到 1 位的数量a ^ b。要强制它输出某个值,只需 make a = 0then b = number with d 1-bits

要获得d1 位数字,请考虑b = (2 to the power of d) - 1.

因此,如果您愿意d = 11,那么a = 0b = (2 to the power of 11) - 1 = 2048 - 1 = 2047

要以编程方式有效地计算 2 的某个幂,请使用以下公式:

2 to the power of k == 1 << k

所以,基本上:encryption(a, b) == d if a = 0 and b = (1 << d) - 1

于 2010-04-10T09:02:21.360 回答
-1

我看到它在 XOR b 中计算 SET 位?

好的,那么假设 a==0,b==4095。

于 2010-04-10T09:00:21.817 回答