Может кто-нибудь объяснить мне эту строку кода? [Дубликат]

0

Я читаю значения с акселерометра и сохраняю их в буфере под названием "значения". Каждое показание акселерометра имеет длину 10 бит, но значения считываются как байты, поэтому показания акселерометра eah фактически представляют собой два байта или два значения в буфере "значений". Это пример кода о том, как объединить эти два байта, чтобы получить одно значение:

x = ((int)values[1]<<8)|(int)values[0];

Я получаю, что я совмещаю значения [1] и значения [2], и я уверен, что часть (int) - это тип, переводящий эти части в виде целых чисел (хотя я не уверен, почему). Части, которые меня действительно путают, составляют <<8 а вертикальная полоса | , Что делают эти две части?

Спасибо за любое объяснение и помощь, которую вы можете дать!

Теги:
arduino
bit-manipulation

5 ответов

0
Лучший ответ

Возьмем, например, 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

3

Это битовая маска.

Вы left shifting (<<) значение в values[1] на 8 бит-позиций. а затем ORing (|) это значение в values[0].

Пожалуйста, примите некоторые значения и попытайтесь с ними справиться. Вы поймете это лучше.

Здесь приведена ссылка для более подробных примеров чтения и бит-манипуляции.

2

Эта строка кода объединяет два символа в int таким образом, что первый символ перемещается на 8 бит.

Например, значение [0] = 5, значение [1] = 1, тогда считанное значение должно быть 128 + 5 = 133. Поскольку высокий байт 1 означает 128. Еще один способ взглянуть на это:

x = ((int)values[1]<<8) + (int)values[0];

Замените или с помощью +, это будет более читаемым. Надеюсь это поможет.

0

Оператор << сдвигает биты во втором байте слева на 8 бит, так что, например, 0000000011111111 становится 1111111100000000. | является двоичным "или" оператором, который объединяет два бита в каждой позиции, делая его 1, если бит или оба бита равны 1.

0

У вас есть 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->.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню