Я читаю значения с акселерометра и сохраняю их в буфере под названием "значения". Каждое показание акселерометра имеет длину 10 бит, но значения считываются как байты, поэтому показания акселерометра eah фактически представляют собой два байта или два значения в буфере "значений". Это пример кода о том, как объединить эти два байта, чтобы получить одно значение:
x = ((int)values[1]<<8)|(int)values[0];
Я получаю, что я совмещаю значения [1] и значения [2], и я уверен, что часть (int) - это тип, переводящий эти части в виде целых чисел (хотя я не уверен, почему). Части, которые меня действительно путают, составляют <<8
а вертикальная полоса |
, Что делают эти две части?
Спасибо за любое объяснение и помощь, которую вы можете дать!
Возьмем, например, 10-битное чтение 0101010111
в двоичном формате.
Нижние 8 бит переходят к values[0] = 01010111
в двоичном (= 87 десятичных).
Более высокие 2 бита идут к values[1] = 01
.
Чтобы восстановить исходное 10-битное число из values
:
(int)values[1] << 8 --> 01 << 8 --> 0100000000
values[1]
преобразуются в int (обычно 32 бита), а затем сдвигаются влево <<
8 бит.
((int)values[1]<<8) | (int)values[0] --> 0100000000 | 01010111
или в вертикальной нотации, чтобы выразить поразрядное или:
0100000000
| 01010111
------------
0101010111
QED
Это битовая маска.
Вы left shifting (<<)
значение в values[1]
на 8
бит-позиций. а затем ORing (|)
это значение в values[0]
.
Пожалуйста, примите некоторые значения и попытайтесь с ними справиться. Вы поймете это лучше.
Здесь приведена ссылка для более подробных примеров чтения и бит-манипуляции.
Эта строка кода объединяет два символа в int таким образом, что первый символ перемещается на 8 бит.
Например, значение [0] = 5, значение [1] = 1, тогда считанное значение должно быть 128 + 5 = 133. Поскольку высокий байт 1 означает 128. Еще один способ взглянуть на это:
x = ((int)values[1]<<8) + (int)values[0];
Замените или с помощью +, это будет более читаемым. Надеюсь это поможет.
Оператор << сдвигает биты во втором байте слева на 8 бит, так что, например, 0000000011111111 становится 1111111100000000. | является двоичным "или" оператором, который объединяет два бита в каждой позиции, делая его 1, если бит или оба бита равны 1.
У вас есть 2 байта (1 байт = 8 бит), и вы пытаетесь прочитать 10-битное значение, поэтому вам нужно 2 байта вместо того, чтобы просто использовать 1. Когда вы читаете значение, вам нужно отбросить 2 байта для int, чтобы вы могли рассматривать их как целое значение, но есть проблема, если value[1]
равно 3 (00000011)
а следующее value[0]
байта value[0]
равно 227 (11100011)
вы можете получить правильное показание, если добавить так что вам нужно бить value[1]
сдвига value[1]
оставленное на 8.
Когда вы смещаете смену unsigned char/char/byte на 8, вы получаете 0, поэтому вам нужно указать как value[1]
и value[0]
в int, поэтому, когда вы выполняете смену бит, вы получаете 768 (00000011 00000000)
теперь вы |
что со value [0]
и вы закончите с
(00000011 00000000 | 00000000 11100011) = (00000011 11100011) = 995
note. Я использую только 16-битные ints, поэтому пример не заполнен связкой 0s.
Если у вас есть доступ к калькулятору программирования, это может помочь вам понять, почему вам нужно передавать эти байтовые значения в ints, это также может просто помочь вам с кастингом в целом. Я бы немного поиграл с помощью приложения "Калькулятор окон", если у вас есть доступ к нему. Чтобы получить его в представлении программиста, перейдите к программисту view->.