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

Views: 3225


  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.


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


  • WiFi ESP8266 – AT команды связанные с функцией Wi-FiWiFi ESP8266 – AT команды связанные с функцией Wi-Fi
    Views: 5751 AT команды связанные с функцией Wi-Fi Функции Wi-Fi подключения, запускаться из командной строки Команда Описание  1 AT+CWMODE Проверка, настройка режима работы Wi-Fi (sta/AP/sta+AP), (не рекомендуется для новых проектов). 2 …
  • Акриловый корпус для платы ch-4000Акриловый корпус для платы ch-4000
    Views: 861 Плата ch-4000 подходит для монтажа в корпуса на дин рейку, но для домашней автоматики необходимо что-то другое, поэтому был разработан корпус из акрила который позволит создавать настольные и настенные устройства. Корпус …
  • MCC PIC24 – модуль OUTPUT COMPARE – в режиме генератора звуковых сигналовMCC PIC24 – модуль OUTPUT COMPARE – в режиме генератора звуковых сигналов
    Views: 805 При проектировании простых устройств автоматики, часто необходимо иметь механизм звукового оповещения. Самый верхний уровень, это формирование голосовых сообщений, но об этом, как то по позже… В самом примитивном …
  • ch-светомузыка от теории до реализацииch-светомузыка от теории до реализации
    Views: 910 Сразу оговоримся технология или теория ch-светомузыки, это постоянно развивающийся процесс и то что будет сказано сегодня завтра может быть опровергнуто и считаться ошибочным. Назовем само решение проблемы автоматического …
  • Стабилизатор тока на SN3350, часть 2Стабилизатор тока на SN3350, часть 2
    Views: 1303 Если вам необходимо разработать устройство с применением мощных светодиодов, то никак не обойтись без применения стабилизатора тока. На настоящий момент стабилизаторы тока являются самым эффективным механизмом, для питания светодиода в течение всего …
  • DS18B20 – удаленный контроль температурыDS18B20 – удаленный контроль температуры
    Views: 3235 Контроль температуры с использованием датчиков температуры DS18B20 и платы ILLISSI-4B-09-primum Проект позволяет подключать к плате ILLISSI-4B-09-primum до 16 датчиков температуры DS18B20, удаленных более 300 метров,  и выводить информацию …
  • MCC PIC24 – модуль REAL-TIME CLOCK AND CALENDAR (RTCC)MCC PIC24 – модуль REAL-TIME CLOCK AND CALENDAR (RTCC)
    Views: 645 RTCC предоставляет пользователю часы реального времени и функция календаря (RTCC), точность “хода” может быть откалибрована. Основные особенности модуля RTCC: • Работает в режиме глубокого сна. • Возможность выбора источника …
  • Проект с использованием MCC часть 09Проект с использованием MCC часть 09
    Views: 1048   Эта часть будет посвящена созданию практического проекта управления освещение. Тех задание: Два выхода управления ШИМ – светодиодным освещением. Две кнопки управления, каждая кнопка управляет, своим каналом, логика самая …
  • Мультизоновый индикатор-терморегулятор ch-c3010Мультизоновый индикатор-терморегулятор ch-c3010
    Views: 1339 Часто возникает необходимость получить информацию по температуре с множества точек контроля. Вам необходимо знать температуру в комнате, в коридоре,  температуру на улице, а в погребе (или на балконе) …
  • Часы + Календарь + Термометр + …Часы + Календарь + Термометр + …
    Views: 2811 Часы + Календарь + Термометр + Индикатор влажности + Секундомер + Дистанционное управление на ИК лучах (пульты на RC-5 протоколе) + Автоматическая регулировка яркости + Возможность вывода данных через USB, …




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