これ:
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です。