Меня интересует новый проект IoT под названием OpenBCI, который в основном представляет собой ЭЭГ с открытым кодом для чтения и обработки волн мозга и других биодатов. В своем docs они утверждают, что данные, передаваемые по эфиру (через RFDuino), отправляют 24-битные данные. Для того, чтобы преобразовать 24-битные значения в 32-разрядных целых чисел, они предлагают следующий Java-дружественную Processing код:24- 32-битное преобразование в Java
int interpret24bitAsInt32(byte[] byteArray) {
int newInt = (
((0xFF & byteArray[0]) << 16) |
((0xFF & byteArray[1]) << 8) |
(0xFF & byteArray[2])
);
if ((newInt & 0x00800000) > 0) {
newInt |= 0xFF000000;
} else {
newInt &= 0x00FFFFFF;
}
return newInt;
}
Я предполагаю, что я пытаюсь понять, что именно здесь происходит. Давайте возьмем первый аннотацию код:
int newInt = (
((0xFF & byteArray[0]) << 16) |
((0xFF & byteArray[1]) << 8) |
(0xFF & byteArray[2])
);
- Почему это безопасно предположить, что существует 3 байта на входе?
- Какое значение имеет значение
0xFF
? - Какова цель левого смещения (
<<
)?
Второй сегмент также немного тайны:
if ((newInt & 0x00800000) > 0) {
newInt |= 0xFF000000;
} else {
newInt &= 0x00FFFFFF;
}
- Почему
newInt & 0x00800000
? Каково значение0x00800000
? - Почему
if-else
основан на положительном и отрицательном результате вышеуказанной операции? - Каково значение
0xFF000000
и0x00FFFFFF
?
Я предполагаю, что с этой функцией будет только много рук и магии, что я хотел бы лучше понять!
Эта последняя часть является неясным способом подписи-расширения, ветка else - это не-op. Более очевидным будет 'newInt = (newInt << 8) >> 8' – harold