誰が何n&-n
を意味するのか助けることができますか?? そして、その意義とは。
8 に答える
これは、 に設定された最下位ビットである 1 つのビットを含む数値を与える古いトリックですn
。少なくとも 2 の補数演算では、これは最近ほぼ普遍的です。
それが機能する理由: 数値の負数は、数値を反転してから 1 を追加することによって生成されます (これが 2 の補数の定義です)。1 を追加すると、設定されている下から始まるすべてのビットが次の上位ビットにオーバーフローします。ゼロビットに到達すると、これは停止します。これらのオーバーフローしたビットはすべてゼロになり、最後に影響を受けたビットより上のビットは互いに逆になるため、カスケードを停止したビット (1 として開始し、0 に反転したビット) だけが残ります。
PS 補数演算に出くわすことが心配な場合は、両方で動作するバージョンを次に示します。
n & (~n + 1)
ほとんどの人が実際に気にかけているほとんどすべてのシステムで、n が割り切れる最大の 2 の累乗が得られます。
n が 2 の累乗であるかどうかを判断するのはトリックだと思います。 (n == (n & -n)) IFF n は 2 の累乗 (1,2,4,8) です。
これは、数値のビット単位の AND です。負の数は2 の補数として表されます。
たとえば、ビット単位の and of 7&(-7) は x00000111 & x11111001 = x00000001 = 1 です。
@aestrivex が言及したように、それは 1.Even の書き方です。
for (int y = x; y > 0; y -= y & -y)
7&(-7) は x00000111 & x11111001 = x00000001 = 1 であるため、y=y-1 を意味します。