大索引的 Java Bitset 错误

标签 java algorithm bitset

这是对 Find an integer not among four billion given ones 中解决方案的跟进因为这是一个旧线程,所以我创建了一个新问题。 我编写了一个 bitset 实现,假设数字在 java MAX_VALUE 和 MIN_VALUE 整数之间。这是代码

void bitsetWay() throws FileNotFoundException
    {
        String path=System.getProperty("user.dir")+"/src/com/sjcode/";
        Scanner in = new Scanner(new FileReader(path+"a.txt"));
        BitSet btpos= new BitSet(Integer.MAX_VALUE);
        BitSet btneg= new BitSet(Integer.MAX_VALUE);

        while(in.hasNextInt()){
            int n = in.nextInt();
            System.out.println(n);
            if (n<0)
            {
                btneg.set(-1*n);
            }
            else
            {
                btpos.set(n);
            }
        }
        System.out.println(btpos.nextClearBit(0) + " : " + btpos);
        //ignore btneg[0] since we treat 0 as +ve
        System.out.println(btneg.nextClearBit(1) + " : " + btneg);
    }

这适用于 a.txt 中的此输入

1 
2 
2147483583
-2
-1 
0

-- 输出:

3 : {0, 1, 2, 2147483583}
3 : {1, 2}

-- 但是当我给出一个数字 > 2147483583 时,它似乎环绕并设置位 0!我错过了什么吗?是的,打印 Integer.MAX_VALUE 会打印 2147483647!

输入:

1
2
2147483584
-2
-1
0

输出:

0 : {0, 1, 2, 2147483584}
3 : {1, 2}

最佳答案

我怀疑这是您的 Java 版本中的错误。我有 Java 7 update 21,它有类似的问题,但不完全相同。

BitSet bs = new BitSet(Integer.MAX_VALUE);
bs.set(Integer.MAX_VALUE-1);
System.err.println(bs);
bs.set(Integer.MAX_VALUE);
System.err.println("Set ok but...");
System.out.println(bs);

打印

{2147483646}
Set ok but...
Exception in thread "main" java.lang.IndexOutOfBoundsException: fromIndex < 0: -2147483647
    at java.util.BitSet.nextSetBit(BitSet.java:701)
    at java.util.BitSet.toString(BitSet.java:1181)
    at java.lang.String.valueOf(String.java:2854)
    at java.io.PrintStream.println(PrintStream.java:821)
    at Main.main(Main.java:12)

关于大索引的 Java Bitset 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17513351/

相关文章:

java - SolrCore 初始化失败,有时会显示 "sorry, no dataimport-handler defined!",有时会抛出以下错误

java - 在亚马逊云的 glassfish 服务器上部署 ear 时出现异常

c++ - 由 cin 的字符串中未捕获的空格导致的段错误

c++ - 为什么 std::bitset 建议的可用位比 sizeof 所说的更多?

C++:定义前注册全局变量

java - 从 XSD 模式生成 Java 类

algorithm - 最小电阻算法

javascript - Codewars Javascript 问题 - 我的带有双 for 循环的代码超时

c++ - 为什么这个 bitset 收集算法不起作用?

java - 尝试将api中的数据获取到JSON时在JSONArray上使用NullPointer