Объяснение кода преобразования 16-разрядного в 10-разрядное

Я наткнулся на следующий код для преобразования 16-разрядных чисел в 10-разрядные и сохранения их в целых числах. Может кто-нибудь объяснить мне, что именно происходит с AND 0x03?

// Convert the data to 10-bits
int xAccl = (((data[1] & 0x03) * 256) + data[0]);
if(xAccl > 511) {
xAccl -= 1024;
}

Ссылка на то, где я получил код: https://www.instructables.com/id/Measurement-of-Acceleration-Using-ADXL345-and-Ardu/

1

Решение

Побитовый оператор & создаст маску, поэтому в этом случае она аннулирует 6 старших бит целого числа.

В основном, этот код делает по модулю % 1024 (для значений без знака).

1

Другие решения

data[1] занимает 2-й байт; & 0x03 маскирует этот байт двоичным 11 — так: занимает 2 бита; * 256 такой же как << 8 то есть помещает эти 2 бита в 9-ю и 10-ю позиции; добавление data[0] чтобы данные объединяли эти два байта (лично я бы использовал |не +).

Так; xAccl теперь первые 10 битов, использующие порядок с прямым порядком байтов.

> 511 кажется, проверка знака; по сути, он говорит: «если установлен 10-й бит, трактуйте все как отрицательное целое число, как если бы мы использовали правила дополнения 10-битных двойок».

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector