2012-02-21 2 views
0

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

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

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

+1

Можете ли вы показать, что операция возвращает -1? –

ответ

3

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

+0

Нет, я никогда не бросал int ... но может ли быть неявное кастинг в моем фрагменте кода? – Mayumi

+0

Вы были правы! Я должен был объявить маску как 1L, а не 1. Спасибо за подсказку. – Mayumi

0

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

+6

Кажется глупым предлагать ошибку в JVM, даже не видя кода OP –

+0

@HunterMcMillen, поэтому я сказал: «Согласился с Лоуренсом ... но если вам все еще не повезло ...» - также есть google о доступны различные JVM и проверьте их списки ошибок. –

+1

Я думаю, что Хантер говорит, что глупо предлагать это ... даже если вы думаете, что это маловероятно ... на том основании, что он скорее всего отправит OP по неправильной дорожке. Вероятно, 99,9999% это не ошибка JVM. –

2

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

(1 << mIndex) 

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

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

(1L << mIndex) 
Смежные вопросы