0

предположит, я пишу некоторые очень простые тесты в андроид приложения, работающие на тренажере (зефир, OSX 64 бит) Whith выход LogCat:побитового оператора на андроид: почему большое число не равно

Log.i("test","long int = "+17301768L); 
Log.i("test","long int = "+(1<<3 | 1<<8 | 1<<19 | 1<<24)); 
Log.i("test","long int = "+ 8607236360L); 
Log.i("test","long int = "+(1<<3 | 1<<8 | 1<<19 | 1<<24 | 1<<33)); 

... LogCat печатает:

long int = 17301768 
long int = 17301768 
long int = 8607236360 
long int = 17301770 

Очевидно, что последняя строка неверна: она должна быть такой же, как в третьей строке.

Почему? И как я могу заставить его работать как ожидалось?

ответ

3

По умолчанию все номера в Java имеют тип int. Поэтому цифры, которые вы создаете, используя бинарные операции являются ИНТ значения, тоже:

(1<<3 | 1<<8 | 1<<19 | 1<<24 | 1<<33) 

1<<33 = 2 
1L<<33 = 8589934592 

int значения ограничены до 31 бит + 1 бит для индикации положительного/отрицательного значения. Поэтому установка 34-го бита ничего не меняет.

Чтобы сделать это, вы должны явно использовать длинные значения для всех битов, которые не вписываются в int. Вы можете сделать это, добавив «L» для длинного числа.

System.out.println((1<<3 | 1<<8 | 1<<19 | 1<<24 | 1L <<33)); // 8607236360 
+1

или просто '1L << 33' – TripeHound

+0

Большое спасибо, Роберт. Теперь он работает так, как ожидалось! – Chrysotribax