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;
}

d の出力値を決定するために、その関数で送信する変数 a と b を見つけるにはどうすればよいですか?

つまり、アルゴリズムを逆にして、d=11 が必要な場合はどうすればよいでしょうか?

4

3 に答える 3

1

dhttp://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetKernighancを参照してください

したがって、ビットごとの XOR 値が正確に 11 ビットになるようにaとを見つける必要があります。ba = 0b = 2047

(これは暗号化ではありません。これは非常に弱い一方向ハッシュです。暗号化は、元の値を取り戻す方法 (復号化) を提供する必要があります。)

于 2010-04-10T09:00:05.063 に答える
1

これ:

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

の 1 ビットの数をカウントしcます。たとえば、 の場合c = 10110、d は 3 になります。

これ:

c = a ^ b;

との間で排他的 orを実行します。これは、 と の両方で同じ位置を共有するすべての 1 ビットがゼロになり、 と で異なる値を持つすべての位置が1になることを意味します。例:ababab

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 = 0およびb = (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 に答える