Ошибка Java 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);
}
Это прекрасно работает для этого ввода в.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}
1 ответ
Я подозреваю, что это ошибка в вашей версии Java. У меня есть Java 7 обновление 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)