4

私は次のトリックを使用して、intのビットセットを反復処理しています。

    while (b != 0)
    {
        c = b & (0 - b);
        //Do something...
        b = b ^ c;
    }

例として、数値4128(バイナリ0001000000100000)を取り上げると、cの値が32と4096であるため、これは正常に機能します。

ただし、実際の値の代わりに、これらの値の位置を指定します。これらは5と12です。

位置を返すループに挿入できる追加のコード行はありますか?

4

5 に答える 5

3

Integer.numberOfTrailingZeros次のように、ビットインデックスを取得するために使用できます。

while (b != 0)
{
    c = b & (0 - b);
    int index = Integer.numberOfTrailingZeros(c);
    //Do something...
    b = b ^ c;
}
于 2013-03-15T12:51:41.623 に答える
1

効率的な答えではありませんが、使用しているトリックを尊重するためです。に変更しましたb &= (b - 1)

int bitCount(int b) {
    int bits = 0;
    while (b != 0) {
        int nextb = b & (b - 1); // Remove the rightmost bit 1

        int power2ofBitIx = b ^ nextb; // Get the lost bit   10..0
        int bitIx = bitCount(power2ofBitIx - 1); // And count 1..1
        // Do something with bitIx

        b = nextb;
        ++bits;
    }
    return bits;
}
于 2013-03-15T10:57:21.440 に答える
0

Jerry Coffin の回答を読んでください。

マスクと各ビットの AND を使用して、int のセット ビットの位置を取得できます。

int c = 4128;
int two_32 = pow(2, 32);
for (int mask = 1, iter = 1; mask < two_32; mask <<= 1, iter++)
    if (c & mask)
        printf("Flag: %d set\n", iter);

これは次のように表示されます。

Flag: 0 set 
Flag: 5 set
于 2013-03-15T10:38:40.213 に答える
0

public boolean isBitSet(int position) {

    int value = Integer.parseInt("0000000000000000000000000000000", 2);
    BigInteger b = new BigInteger(String.valueOf(value));
    b = b.setBit(4);
    return b.testBit(4);

}

于 2015-07-15T12:26:20.717 に答える
0

ビットボード ゲームを作成する場合は、ビットの位置ではなく、値が必要になるはずです。

私は前にあなたの while ループを見たことがありません。個人的にはこれが好きです:

int tst = 255;

for(int looper = tst, i = Integer.highestOneBit(looper); looper != 0; looper &= ~i, i = Integer.highestOneBit(looper))
{
    System.out.println(i);
}   
于 2013-03-16T22:57:57.033 に答える