Java 如何列出一个计数数字中的数字?

Java 如何列出一个计数数字中的数字?,java,biginteger,Java,Biginteger,快速列出Java BigInteger的1有哪些选项?我们可以假设BigInteger为正,但它可能是一个相当大的Java BigInteger,具有稀疏分布的1。然而,我们希望尽快找到他们。我希望Java BigInteger的1的位位置有一个枚举器或迭代器 使用.toString(基数)方法。如下所示:biginger.toString(2),然后检查字符串中的值使用.toString(基数)方法。如下所示:biginger.toString(2),然后检查字符串中的值您可以使用biging

快速列出Java BigInteger的1有哪些选项?我们可以假设BigInteger为正,但它可能是一个相当大的Java BigInteger,具有稀疏分布的1。然而,我们希望尽快找到他们。我希望Java BigInteger的1的位位置有一个枚举器或迭代器

使用.toString(基数)方法。如下所示:biginger.toString(2),然后检查字符串中的值

使用.toString(基数)方法。如下所示:biginger.toString(2),然后检查字符串中的值

您可以使用
biginger
的和方法。例如,要将其打印出来:

public静态最终void printOneIndexes(biginger n){
而(!n.equals(biginger.ZERO)){
int i=n.getLowestSetBit();
System.out.printf(“%d”,i);
n=n.clearBit(i);
}
}

您可以使用
biginger
的和方法。例如,要将其打印出来:

public静态最终void printOneIndexes(biginger n){
而(!n.equals(biginger.ZERO)){
int i=n.getLowestSetBit();
System.out.printf(“%d”,i);
n=n.clearBit(i);
}
}

可以使用
getLowestSetBit()
,但测试表明,以下速度大约为3-4倍:

public static final void printOneIndexes(BigInteger n)
{
    for (int i = 0; i < n.bitLength(); i++)
    {
        if (n.testBit(i))
            System.out.printf(" %d", i);
    }
}
public静态最终void printOneIndexes(biginger n)
{
对于(int i=0;i
当然,如果您删除打印,并将结果存储在列表中,则打印速度会更快

我用一个只设置了几位的BigInteger测试了它,它是由:

public static BigInteger makeSparseInt()
{
    BigInteger b = BigInteger.ZERO.setBit(1000000);

    Random r = new Random();

    for (int i = 0; i < 100; i++)
    {
        b = b.setBit(r.nextInt(1000000));
    }
    return b;
}
public static biginger makeSparseInt()
{
BigInteger b=BigInteger.ZERO.setBit(1000000);
随机r=新随机();
对于(int i=0;i<100;i++)
{
b=b.setBit(r.nextInt(1000000));
}
返回b;
}

可以使用
getLowestSetBit()
,但测试表明,以下速度大约为3-4倍:

public static final void printOneIndexes(BigInteger n)
{
    for (int i = 0; i < n.bitLength(); i++)
    {
        if (n.testBit(i))
            System.out.printf(" %d", i);
    }
}
public静态最终void printOneIndexes(biginger n)
{
对于(int i=0;i
当然,如果您删除打印,并将结果存储在列表中,则打印速度会更快

我用一个只设置了几位的BigInteger测试了它,它是由:

public static BigInteger makeSparseInt()
{
    BigInteger b = BigInteger.ZERO.setBit(1000000);

    Random r = new Random();

    for (int i = 0; i < 100; i++)
    {
        b = b.setBit(r.nextInt(1000000));
    }
    return b;
}
public static biginger makeSparseInt()
{
BigInteger b=BigInteger.ZERO.setBit(1000000);
随机r=新随机();
对于(int i=0;i<100;i++)
{
b=b.setBit(r.nextInt(1000000));
}
返回b;
}

如果可以直接测试位
biginger.testBit(int n)
,为什么要转换为字符串?@Ridcully结果将与
biginger.bitCount()
相同,这可能更易于阅读和理解。@Ridcully,因为这不是问题所在。OP需要的是位的位置,而不是位数。如果可以直接测试位
biginger.testBit(int n)
,为什么要转换为字符串?@Ridcully结果将与
biginger.bitCount()
相同,这可能更容易阅读和理解。@Ridcully,因为这不是问题所在。OP想要的是位的位置,而不是它们的数量。Chai T.Rex的回答符合您的要求,但我不确定它是否比简单地在循环中使用
testBit()
测试每个位更快(Henry的评论)。你可以测试两者,看看哪个更快或者至少足够快。如果1位非常稀疏,那么
getLowestSetBit()
--
clearBit()
方法可能会更快。Chai T.Rex的答案符合您的要求,但我不确定它是否比在循环中使用
testBit()
简单地测试每个位快(Henry的评论)。你可以测试两者,看看哪个更快或者至少足够快。如果1位非常稀疏,那么
getLowestSetBit()
--
clearBit()
方法可能会更快。