簡體   English   中英

獲取整數位集的位置

[英]Getting position of a set bit in an integer

我正在使用以下技巧來遍歷int的位集:

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

以數字4128(二進制0001000000100000)為例,這可以正常工作,因為c的值是32和4096。

但是,我希望這些值的位置不是實際值,而是5和12。

是否有一行額外的代碼可以插入到將返回位置的循環中?

您可以使用Integer.numberOfTrailingZeros來獲取位索引,如下所示:

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

不是一個有效的答案,而是為了兌現你正在使用的技巧。 我把它改為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;
}

閱讀Jerry Coffin的回答

您可以使用掩碼獲取int的設置位的位置並對每個位進行AND運算:

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

如果你打算做一個位板游戲,你不應該需要位的位置而是值。

我以前從未見過你的while循環,很好。 我個人喜歡這個:

int tst = 255;

for(int looper = tst, i = Integer.highestOneBit(looper); looper != 0; looper &= ~i, i = Integer.highestOneBit(looper))
{
    System.out.println(i);
}   

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);

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM