Java: манипулировать битами в числе

Я пытался реализовать на 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

I assume I am reaching negative values or something like that. I would be very happy if someone could show me a very efficient way of manipulating all 64 bits in a long-number.

Привет, Финн

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
55
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

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

Я пробовал использовать долгий, но все тот же результат. Что ты имеешь в виду?

Finn Eggers 26.05.2018 13:55

Хм, как насчет замены 1 на 1L?

snake_case 26.05.2018 13:56

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

Другие вопросы по теме