6

これら 2 つの関数のビット ロジックを理解できません。

  1. 条件 (bitVector & mask) == 0 をチェックしている理由がわかりません。

  2. また、条件が満たされたときに bitVector と mask を OR し、それ以外の場合は bitVector と ~mask を AND するのはなぜですか?

  3. 「整数から 1 を減算し、それを元の整数と AND することによって、正確に 1 ビットが設定されていることを確認する」ことができるようなプロパティがあるのはなぜですか?

完全なコードはこちら

/* Toggle the ith bit in the integer. */
public static int toggle(int bitVector, int index) {
    if (index < 0) return bitVector;

    int mask = 1 << index;
    if ((bitVector & mask) == 0) {
        bitVector |= mask;
    } else {
        bitVector &= ~mask;
    }
    return bitVector;
}

/* Check that exactly one bit is set by subtracting one from the 
 * integer and ANDing it with the original integer. */
public static boolean checkExactlyOneBitSet(int bitVector) {
    return (bitVector & (bitVector - 1)) == 0;
}
4

1 に答える 1

10

まず、mask正確に 1 つのビット セットがあり、他のすべてのビットが 0 であることを理解することが重要です。インデックスが 0 の場合、マスクは 1 です。インデックスが 1 の場合、マスクは 2 です。インデックスが 2 の場合、マスクは 4 です。インデックスが 3 の場合、マスクは 8 です。インデックスが 4 の場合、マスクは 16 です。以下同様です。mask のこれらすべての値には、正確に 1 つのビット セット (index 番目のビット) があります。

条件 (bitVector & mask) == 0 をチェックしている理由がわかりません。

この条件は、ビットが設定されていない場合に真になります。ビットが設定されていた場合、 の結果はbitVector & maskに等しくなりmask、ゼロではないことがわかっています。

また、条件が満たされたときに bitVector と mask を OR し、それ以外の場合は bitVector と ~mask を AND するのはなぜですか?

値の OR をとってビットを設定します。AND~maskを使用して、ビットを設定解除します。mask には正確に 1 つのビット セットがあるため、~mask1 つを除くすべてのビット セットがあることに注意してください。

「整数から 1 を減算し、それを元の整数と AND することによって、正確に 1 ビットが設定されていることを確認する」ことができるようなプロパティがあるのはなぜですか?

数値から 1 を引くと、最後の 1 の後のすべてのビットが 1 になります。これは、基数 10 の数値が 1 つまたは複数のゼロで終わる場合に、1 を引くと後続のすべてのゼロが 9 になるのと同じ理由で発生します。一連の数値と、1 を引いた後の値を 2 進数で表すことをお勧めします。単純な計算が明らかになります。

16 の例を見てみましょう。

16 : 10000
15 : 01111

2 つの数値を AND 演算すると 0 になることは明らかです。別の例である 48 を見てみましょう。

48 : 110000
47 : 101111

数値 num と num-1 の AND 演算は、基本的に最後の 1 から最後までのすべてのビットをゼロにすることは明らかです。以前に他のビットがあった場合、それらは残り、結果はゼロにはなりません。1 が 1 つしかない場合、結果はゼロになります。

于 2016-11-30T07:02:35.567 に答える