Проблема с битовой операцией (сдвиг, маскировка и т. д.)

Почему это выражение всегда дает -2 147 483 648 (11111111 11111111 11111111 11111111)? Я не понимаю. data[] представляет собой массив байтов, заполненный некоторыми значениями.

(((int)data[29] & 0x00000001) << 31) | (((int)data[30]&0x000000FF)<<12) | (((int)data[31]&0x000000FF)<<4) | (((int)data[32]&0x000000FF)>>>4)

Спасибо.


person Armai    schedule 19.12.2017    source источник
comment
Я думаю, что для решения этой проблемы нам нужно знать начальное значение от data[29] до data[32].   -  person John Wu    schedule 19.12.2017
comment
Какой язык? Каков фактический тип данных data? На какой платформе вы работаете? Чему вы присваиваете это выражение и каков его тип данных?   -  person lurker    schedule 19.12.2017
comment
Я предполагаю, что это Ява. И (int)data[32]&0x000000FF)>>>4 будет эквивалентно (int)data[32]&0x000000F0)>>>4, потому что 4 младших бита все равно будут отброшены.   -  person phuclv    schedule 19.12.2017
comment
Это поля от data[29] до data[32]: 00101001 11111111 11111001 11001111 И да, это Java!   -  person Armai    schedule 19.12.2017


Ответы (1)


person    schedule
comment
Можете ли вы проверить это с этими значениями? данные[29] к данным[32]: 00101001 11111111 11111001 11001111 - person Armai; 19.12.2017
comment
он не может установить все биты в один, потому что он не устанавливает все биты в результате - person phuclv; 20.12.2017
comment
Наконец, я обнаружил, что ((int)data[29] & 0x00000001) ‹‹ 31) всегда возвращает значение Integer-MIN. Когда я уменьшаю количество смен с 31 до примерно 15, этого больше не происходит. Является ли это особым поведением моего устройства во время выполнения? Тестирую на смартфоне с Android 5. - person Armai; 20.12.2017
comment
Старший бит кодирует знак в Java. Кроме того, целые числа Java кодируются с использованием кодировки 2complement, где 100...00 — наименьшее значение. В устройстве нет ничего плохого, и именно так Java/JVM кодирует целые числа. См. здесь: en.m.wikipedia.org/wiki/Two%27s_complement - person diginoise; 21.12.2017