Сдвиг переменной, Битовые операторы…

Views: 3232


  1. Сдвиг переменной
  2. Битовые операторы (&,|,^,~,<<,>>)
  3. Логические операторы (||, &&, !, ==, !=, >, <, >=, <=)
  4. Условный оператор (?)
  5. Оператор Запятая (,)

Сдвиг переменной на n бит

В микроконтроллерах часто приходиться работать с данными на «низком» уровне. Поэтому коснемся темы сдвига битов переменной.

unsigned char foo; // должна быть описана как целая без знака, иначе логический сдвиг вправо превратиться в арифметический.

foo = (foo >> 1); // сдвиг на 1 вправо
foo = (foo << 2); // сдвиг на 2 влево

Сдвиг с вращением битов переменной

unsigned char foo; // должна быть описана как целая без знака

foo = (foo >> 1) | (foo << 7); // вращение вправо на 1 бит
foo = (foo << 1) | (foo >> 7); // вращение влево

unsigned int foo; // должна быть описана как целая без знака

foo = (foo >> 1) | (foo << 15); // вращение вправо на 1 бит
foo = (foo << 1) | (foo >> 15); // вращение влево


Битовые операторы (&,|,^,~,<<,>>)

Эти операции будут всегда присутствовать в наших программах.

Оператор

ASM эквивалент

Описание

&

AND

Побитовый оператор И

И

0011

0101

0001

|

OR

Побитовое включающее или

ИЛИ

0011

0101

0111

^

XOR

Побитовое исключающее или

Искл.

ИЛИ

0011

0101

0110

~

НЕ

Унарный дополнение (бит инверсии)

НЕ

01

10

<< 

SHL

Сдвиг влево

>> 

SHR

Сдвинуть вправо

 


test & 0b10000000 истинно, если в 7 разряде test «1».

Примеры

// проверка разрядов, где стоят 1 на наличия 1

// е.е. когда в 7 и 6 разрядах единицы (остальные не имеют значения)

// тогда выражение истинно

if ((test & 0b10000000)&&(test & 0b01000000))test=1;
else test=0;

// проверка разрядов, где стоят 0 на наличия 0

// е.е. когда в 7 и 6 разрядах нули (остальные не имеют значения)

// тогда выражение истинно

if (!(test & 0b10000000)&& !(test & 0b01000000))test=1;
else test=0;

Логические операторы (||, &&, !, ==, !=, >, <, >=, <=)

 Необходимо ясно представлять различие между битовыми и логическими операторами. Битовые выполняют операции над данными по битам и возвращают результат данные. Логические операторы оперируют общим значение с данными ИСТИНА или ЛОЖЬ и возвращают значение ИСТИНА или ЛОЖЬ (1 или 0).

|| логическая операция ИЛИ
&& логическая операция И
! логическая операция НЕ
== Равно
!= Не равно
> Больше, чем
< Меньше чем
>= Больше или равно
<= Меньше или равно
Вот несколько примеров:

(7 == 5)     // эквивалентно ЛОЖЬ.
(5 > 4)       // эквивалентно ИСТИНА.
(3 != 2)      // эквивалентно ИСТИНА.
(6 >= 6)     // эквивалентно ИСТИНА.
(5 < 5)       // эквивалентно ЛОЖЬ.
!(5 ==5)   // (5 ==5) – ИСТИНА, а ! – получаем ЛОЖЬ.

 ЛОЖЬ когда полученное выражение равно нулю. ИСТИНА – когда полученное выражение больше нуля.

Конечно вместо того, чтобы с помощью только числовые константы, мы можем использовать любое допустимое выражение, включая переменные. Предположим, что = 2, b = 3 и c = 6.

(a == 5)     // эквивалентно ЛОЖЬ, так «a» не равняется 5.
(a*b >= c)   // эквивалентно ИСТИНА, так как выражение (2*3 >= 6) ИСТИНА.
(b+4 > a*c)  // эквивалентно ЛОЖЬ, так  как выражение (3+4 > 2*6) ЛОЖЬ.
((b=2) == a) // эквивалентно ИСТИНА.

Будь осторожен! Оператор = (один знак равенства) не является таким же, как оператор == (два равных знаки), первый из них является оператором присваивания (присваивает значение, стоящее справа переменной слева) и другая (==) является оператор равенства, который сравнивает ли оба выражения в обе стороны от него равны друг другу.

Таким образом, в последнем выражении ((b=2) == а), мы сначала присвоено значение 2 к b и затем мы сравнил его звучание с а , который также хранит значение 2, поэтому результат операции является значение true.


Условный оператор (?)

? – условный оператор (знак вопроса)

состояние? result1: result2

Если условие имеет значение true, выражение будет возвращать result1, если это не она будет возвращать result2.

Пример:

7==5 ? 4 : 3       // результат 3, так как 7 не равно 5.
7==5+2 ? 4 : 3     // результат 4, так как 7 равно 5+2.
5>3 ? a : b        // результат a, так как 5 больше 3.
a>b ? a : b        // результат зависит от того какая переменная больше, a или b.

Оператор Запятая (,)

Оператор Запятая (,) используется для разделения двух или более выражений, которые включены, где ожидается только одно выражение.

Когда набор выражений должна оцениваться с точки зрения значение, рассматривается только крайнего правого выражения.

Например, следующий код:

a = (b=3, b+2);

Будет вначале присвоить значение 3 – b переменной, а затем вычислено b + 2. Таким образом, в конце, переменная a будет содержать значение 5, переменная b будет содержать значение 3.


Это может быть интересно


  • Бегущие огни на WS2812BБегущие огни на WS2812B
    Views: 5057 В настоящее время большой популярностью стали пользоваться светодиоды со встроенным драйвером WS2812B. Текущий проект предназначен показать возможность использования и управления этими светодиодами. Это и проект и исследование по …
  • MTouch® Модуль Емкостной Библиотеки для MPLAB®X Code Configurator (MCC)MTouch® Модуль Емкостной Библиотеки для MPLAB®X Code Configurator (MCC)
    Views: 1446 Введение MTouch ® Модуль Емкостной Библиотеки для MPLAB ® X Code Configurator (MCC) позволяет быстро и легко генерировать решение кода на  Cи для емкостной сенсорной кнопки, датчика приближения и слайдера.
  • Kitchen timer with contactless gesture controlKitchen timer with contactless gesture control
    Views: 822    Кухонний таймер з безконтактним керуванням жестами дозволяє встановити необхідний період часу для приготування страв, не торкаючись пристрою. Дуже зручно під час приготування їжі, коли руки забрудниться. Усі …
  • TDA7294 part 1TDA7294 part 1
    Views: 509 TDA7294 має унікальні дані для створення підсилювачів звукової частоти HI-FI класу. Варіант застосування є конфігурація BRIDGE (мостова схема включення), де використовуються два TDA7294, як показано на схематичній діаграмі …
  • Гаджеты для домашней автоматики – Датчик движенияГаджеты для домашней автоматики – Датчик движения
    Views: 1510 Управление светодиодным освещением – Датчик движения. Данный гаджет предназначен для управления освещением рабочих столов (кухонных столов), освещение прихожих, освещение зеркал в прихожих, автоматическое включение света в коридорах. Датчик позволяет …
  • Одноканальный емкостной сенсор – AT42QT1012Одноканальный емкостной сенсор – AT42QT1012
    Views: 2496 Описание сенсора [wpdm_file id=242] Незаконченный проект, так-как сенсор не оправдал своего назначения, не рекомендую, просто выброшенные деньги. Особенности. • Количество сенсоров – один, режим переключения ( touch-on/touch-off ), а также программируемая …
  • VU Meter Tower ART – part 2VU Meter Tower ART – part 2
    Views: 1241 Проект – VU Meter Tower ART получил продолжение в своем развитии. Теперь можно заказать набор деталей из акрила для самостоятельной сборки. В проект корпуса внесено целый ряд доработок, …
  • Простой цифровой регулятор мощностиПростой цифровой регулятор мощности
    Views: 7853 Простой регулятор мощности с цифровой индикацией. Этот проект создан как обучающий, для ознакомления с основами построения сетевых регуляторов мощности. Устройства подобного типа можно использовать для управления освещением, скоростью …
  • WiFi ESP8266 – AT команды связанные с функцией Wi-FiWiFi ESP8266 – AT команды связанные с функцией Wi-Fi
    Views: 5838 AT команды связанные с функцией Wi-Fi Функции Wi-Fi подключения, запускаться из командной строки Команда Описание  1 AT+CWMODE Проверка, настройка режима работы Wi-Fi (sta/AP/sta+AP), (не рекомендуется для новых проектов). 2 …
  • LCD драйвер – UC1601sLCD драйвер – UC1601s
    Views: 1837 http://svetomuzyka.narod.ru/project/UC1601s.html Читайте обновление на http://catcatcat.d-lan.dp.ua/?page_id=178 В данный момент можно приобрести в ООО “Гамма” несколько типов индикаторов на драйвере UC1601s. RDX0048-GC, RDX0077-GS, RDX0154-GC и RDX0120-GC выполнены по технологии COG.




Поделись этим!