これ:
while(c) {
c &= c - 1;
d++;
}
の 1 ビットの数をカウントしc
ます。たとえば、 の場合c = 10110
、d は 3 になります。
これ:
c = a ^ b;
との間で排他的 orを実行します。これは、 と の両方で同じ位置を共有するすべての 1 ビットがゼロになり、 と で異なる値を持つすべての位置が1になることを意味します。例:a
b
a
b
a
b
101110 ^
011010
========
110100
したがって、基本的に、アルゴリズムは の 1 ビットの数を見つけますa ^ b
。特定の値を強制的に出力するには、 make a = 0
then を実行しb = number with d 1-bits
ます。
d
1 ビットの数値を取得するには、 を検討して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
です。