Я наткнулся на следующий код для преобразования 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/
Побитовый оператор &
создаст маску, поэтому в этом случае она аннулирует 6 старших бит целого числа.
В основном, этот код делает по модулю % 1024
(для значений без знака).
data[1]
занимает 2-й байт; & 0x03
маскирует этот байт двоичным 11
— так: занимает 2 бита; * 256
такой же как << 8
то есть помещает эти 2 бита в 9-ю и 10-ю позиции; добавление data[0]
чтобы данные объединяли эти два байта (лично я бы использовал |
не +
).
Так; xAccl
теперь первые 10 битов, использующие порядок с прямым порядком байтов.
> 511
кажется, проверка знака; по сути, он говорит: «если установлен 10-й бит, трактуйте все как отрицательное целое число, как если бы мы использовали правила дополнения 10-битных двойок».