Java 获取整数中集合位的位置
我使用以下技巧迭代int的位集: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的 您可以使
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);