Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 获取整数中集合位的位置_Java_Bit Manipulation - Fatal编程技术网

Java 获取整数中集合位的位置

Java 获取整数中集合位的位置,java,bit-manipulation,Java,Bit Manipulation,我使用以下技巧迭代int的位集: while (b != 0) { c = b & (0 - b); //Do something... b = b ^ c; } 以数字4128(二进制0001000000000)为例,由于c的值是32和4096,所以这可以正常工作 然而,我想要的不是实际值,而是那些值的位置,它们是5和12 是否有一行额外的代码可以插入到将返回位置的循环中?阅读Jerry Coffin的 您可以使

我使用以下技巧迭代int的位集:

    while (b != 0)
    {
        c = b & (0 - b);
        //Do something...
        b = b ^ c;
    }
以数字4128(二进制0001000000000)为例,由于c的值是32和4096,所以这可以正常工作

然而,我想要的不是实际值,而是那些值的位置,它们是5和12

是否有一行额外的代码可以插入到将返回位置的循环中?

阅读Jerry Coffin的

您可以使用掩码和对每一位进行and和ing来获得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);

这不是一个有效的答案,而是为了尊重你正在使用的技巧。我把它改为
b&=(b-1)


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

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

如果你要做一个比特板游戏,你不应该需要比特的位置,而是需要比特的值

我以前从没见过你的while环,不错。我个人喜欢这个:

int tst = 255;

for(int looper = tst, i = Integer.highestOneBit(looper); looper != 0; looper &= ~i, i = Integer.highestOneBit(looper))
{
    System.out.println(i);
}   
公共布尔值isBitSet(整数位置){


}

您是否考虑过对-循环使用普通的旧
?您可以使用
整数.numberoftrailingzero
来获取位索引。@harold这应该是一个很好的答案。非常好。@harold为了避免额外的代码行,您的建议应该被标记为答案。上面的代码是有效的,但是它会循环所有位,而不是像我原来的循环那样直接跳到位集。您好,您的答案似乎不正确。未使用
位置
参数。最好有一些文字来解释你的答案,而不仅仅是一段代码。
while (b != 0)
{
    c = b & (0 - b);
    int index = Integer.numberOfTrailingZeros(c);
    //Do something...
    b = b ^ c;
}
int tst = 255;

for(int looper = tst, i = Integer.highestOneBit(looper); looper != 0; looper &= ~i, i = Integer.highestOneBit(looper))
{
    System.out.println(i);
}   
    int value = Integer.parseInt("0000000000000000000000000000000", 2);
    BigInteger b = new BigInteger(String.valueOf(value));
    b = b.setBit(4);
    return b.testBit(4);