Установка 32-го бита для длинного типа Java дает -1 - PullRequest
0 голосов
/ 21 февраля 2012

Я использую примитивный тип данных Java для хранения флага. long имеет 8 байтов, поэтому 64 бита с битом старшего разряда, представляющим знаковый бит, поэтому у нас есть 63 используемых бита в качестве флага. Все работает до тех пор, пока я не включу 32-х битный выход -1. Почему это происходит?

Редактировать: в основном я пытаюсь пометить доступность в течение часа для первых 60 бит (1 бит, представляющий минуты в часе) для длинных типов данных. Давайте предположим, что время начала 0: 0: 00. Все работает, если время окончания до 0:30:00, но не с 0:31:00 до 60 минут, то есть, когда я пытаюсь (значение & (1 << 31)) для некоторого значения, инициализированного до 0, это будет не возвращает 2 ^ 31, а возвращает -1. </p>

Редактировать: объявление маски 1 л, а не 1 решило проблему.

Ответы [ 3 ]

3 голосов
/ 21 февраля 2012

Вы должны вставить свой код, но я предполагаю, что у вас есть "int" где-то в вашей математике, и это превращается в -1, прежде чем оно будет приведено к длинному.

2 голосов
/ 21 февраля 2012

Я думаю, что это ваша ошибка:

(1 << mIndex)

Это выполняет сдвиг на 1, который является int. Если вы выполните сдвиг на int, результатом будет int, даже если 2-й операнд больше 32.

Попробуйте вместо этого:

(1L << mIndex)
0 голосов
/ 21 февраля 2012

Согласен с Лоуренсом Кестулутом, но если вам все еще не повезло, это может быть ошибкой в ​​вашей реализации JVM. Вам также может повезти, используя класс java.util.BitSet.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...