Java: манипулировать битами в числе - PullRequest
0 голосов
/ 26 мая 2018

Я пытался реализовать инструмент манипулирования битами в Java.Я не хочу работать с классом Bitset.

Я работаю с 64-битными значениями Long и реализовал следующие методы:

static final long toggle_bit(long number, int index) {
    return (number ^= (1 << index));
}

static final long set_bit(long number, int index) {
    return (number |= (1 << index));
}

static final long unset_bit(long number, int index) {
    return (number &= ~(1 << index));
}

static final void print_bits(long number) {
    String s = Long.toBinaryString(number);
    String zeros = "0000000000000000000000000000000000000000000000000000000000000000"; //String of 64 zeros
    s = zeros.substring(s.length()) + s;
    System.out.println(s);
}

Я думаю, что лучший способ показатьмоя проблема - результат этого кода:

>>> print_bits(set_bit(0L, 30));
0000000000000000000000000000000001000000000000000000000000000000

>>> print_bits(set_bit(0L, 31));
1111111111111111111111111111111110000000000000000000000000000000

Я предполагаю, что достигаю отрицательных значений или чего-то в этом роде.Я был бы очень рад, если бы кто-нибудь показал мне очень эффективный способ манипулирования всеми 64 битами в длинном числе.

Привет, Финн

Ответы [ 2 ]

0 голосов
/ 26 мая 2018

Вы смещаете значение int на 1. Попробуйте сместить длинное значение на 1, т.е. 1L << index

0 голосов
/ 26 мая 2018

Сделать index и 1 a long (объявить как 1L), чтобы JVM не воспринимала его как целое число.

Я также должен отметить, что в set_bits, |= (или равно) не учитывает, когда бит равен 1, но требуемое значение в бите равно 0

...