Как установить * любой * бит в длинной Java, даже если битовая позиция> 30
Я знаком с тем, как устанавливать и очищать определенные биты в числовой переменной Java. Но я не уверен, как манипулировать битами в позиции> 30 в long
,
Я читал, что Java обрабатывает longs
как два ints
для размеров кучи менее 30 ГБ. Установка размера кучи в 45 ГБ (на экземпляре EC2) не помогла.
Я подтвердил, что я использую 64-битную Java:
$ java -version
openjdk version "1.8.0_71"
OpenJDK Runtime Environment (build 1.8.0_71-b15)
OpenJDK 64-Bit Server VM (build 25.71-b15, mixed mode)
Есть ли способ изменить биты в любой позиции в Java long
?
Я думаю, что это тот же вопрос, но для C. Но это не помогло мне.
Вот код и вывод, который иллюстрирует мое затруднительное положение. Как видите, он прекрасно работает до 31-го бита.
private static long setBit(long bits, int bitPosition) {
return bits | (1 << bitPosition);
}
private static long clearBit(long bits, int bitPosition) {
return bits & ~(1 << bitPosition);
}
public static void main(String[] args) {
for (int i = 0; i < 64; i++) {
long myLong = clearBit(Long.MAX_VALUE, i);
System.out.println(Long.toBinaryString(myLong) + " " + i + " " + myLong);
}
}
выход:
111111111111111111111111111111111111111111111111111111111111110 0 9223372036854775806
111111111111111111111111111111111111111111111111111111111111101 1 9223372036854775805
111111111111111111111111111111111111111111111111111111111111011 2 9223372036854775803
111111111111111111111111111111111111111111111111111111111110111 3 9223372036854775799
111111111111111111111111111111111111111111111111111111111101111 4 9223372036854775791
111111111111111111111111111111111111111111111111111111111011111 5 9223372036854775775
111111111111111111111111111111111111111111111111111111110111111 6 9223372036854775743
111111111111111111111111111111111111111111111111111111101111111 7 9223372036854775679
111111111111111111111111111111111111111111111111111111011111111 8 9223372036854775551
111111111111111111111111111111111111111111111111111110111111111 9 9223372036854775295
111111111111111111111111111111111111111111111111111101111111111 10 9223372036854774783
111111111111111111111111111111111111111111111111111011111111111 11 9223372036854773759
111111111111111111111111111111111111111111111111110111111111111 12 9223372036854771711
111111111111111111111111111111111111111111111111101111111111111 13 9223372036854767615
111111111111111111111111111111111111111111111111011111111111111 14 9223372036854759423
111111111111111111111111111111111111111111111110111111111111111 15 9223372036854743039
111111111111111111111111111111111111111111111101111111111111111 16 9223372036854710271
111111111111111111111111111111111111111111111011111111111111111 17 9223372036854644735
111111111111111111111111111111111111111111110111111111111111111 18 9223372036854513663
111111111111111111111111111111111111111111101111111111111111111 19 9223372036854251519
111111111111111111111111111111111111111111011111111111111111111 20 9223372036853727231
111111111111111111111111111111111111111110111111111111111111111 21 9223372036852678655
111111111111111111111111111111111111111101111111111111111111111 22 9223372036850581503
111111111111111111111111111111111111111011111111111111111111111 23 9223372036846387199
111111111111111111111111111111111111110111111111111111111111111 24 9223372036837998591
111111111111111111111111111111111111101111111111111111111111111 25 9223372036821221375
111111111111111111111111111111111111011111111111111111111111111 26 9223372036787666943
111111111111111111111111111111111110111111111111111111111111111 27 9223372036720558079
111111111111111111111111111111111101111111111111111111111111111 28 9223372036586340351
111111111111111111111111111111111011111111111111111111111111111 29 9223372036317904895
111111111111111111111111111111110111111111111111111111111111111 30 9223372035781033983
1111111111111111111111111111111 31 2147483647
111111111111111111111111111111111111111111111111111111111111110 32 9223372036854775806
111111111111111111111111111111111111111111111111111111111111101 33 9223372036854775805
111111111111111111111111111111111111111111111111111111111111011 34 9223372036854775803
111111111111111111111111111111111111111111111111111111111110111 35 9223372036854775799
111111111111111111111111111111111111111111111111111111111101111 36 9223372036854775791
111111111111111111111111111111111111111111111111111111111011111 37 9223372036854775775
111111111111111111111111111111111111111111111111111111110111111 38 9223372036854775743
111111111111111111111111111111111111111111111111111111101111111 39 9223372036854775679
111111111111111111111111111111111111111111111111111111011111111 40 9223372036854775551
111111111111111111111111111111111111111111111111111110111111111 41 9223372036854775295
111111111111111111111111111111111111111111111111111101111111111 42 9223372036854774783
111111111111111111111111111111111111111111111111111011111111111 43 9223372036854773759
111111111111111111111111111111111111111111111111110111111111111 44 9223372036854771711
111111111111111111111111111111111111111111111111101111111111111 45 9223372036854767615
111111111111111111111111111111111111111111111111011111111111111 46 9223372036854759423
111111111111111111111111111111111111111111111110111111111111111 47 9223372036854743039
111111111111111111111111111111111111111111111101111111111111111 48 9223372036854710271
111111111111111111111111111111111111111111111011111111111111111 49 9223372036854644735
111111111111111111111111111111111111111111110111111111111111111 50 9223372036854513663
111111111111111111111111111111111111111111101111111111111111111 51 9223372036854251519
111111111111111111111111111111111111111111011111111111111111111 52 9223372036853727231
111111111111111111111111111111111111111110111111111111111111111 53 9223372036852678655
111111111111111111111111111111111111111101111111111111111111111 54 9223372036850581503
111111111111111111111111111111111111111011111111111111111111111 55 9223372036846387199
111111111111111111111111111111111111110111111111111111111111111 56 9223372036837998591
111111111111111111111111111111111111101111111111111111111111111 57 9223372036821221375
111111111111111111111111111111111111011111111111111111111111111 58 9223372036787666943
111111111111111111111111111111111110111111111111111111111111111 59 9223372036720558079
111111111111111111111111111111111101111111111111111111111111111 60 9223372036586340351
111111111111111111111111111111111011111111111111111111111111111 61 9223372036317904895
111111111111111111111111111111110111111111111111111111111111111 62 9223372035781033983
1111111111111111111111111111111 63 2147483647
Спасибо за чтение - любые рекомендации / код / предложения будут с благодарностью!
2 ответа
1<<32
переполнится, так как это int
, Вы должны изменить это на long
,
return bits | (1L << bitPosition)
private static long clearBit(long bits, int bitPosition) {
return bits & ~(1l << bitPosition);
}
1 без a l - это int, это ваша ошибка.