Views: 3232
- Сдвиг переменной
- Битовые операторы (&,|,^,~,<<,>>)
- Логические операторы (||, &&, !, ==, !=, >, <, >=, <=)
- Условный оператор (?)
- Оператор Запятая (,)
Сдвиг переменной на 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 |
Побитовый оператор И
|
||||
|
| |
OR |
Побитовое включающее или
|
||||
|
^ |
XOR |
Побитовое исключающее или
|
||||
|
~ |
НЕ |
Унарный дополнение (бит инверсии)
|
||||
|
<< |
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) // эквивалентно ЛОЖЬ. |
ЛОЖЬ когда полученное выражение равно нулю. ИСТИНА – когда полученное выражение больше нуля.
Конечно вместо того, чтобы с помощью только числовые константы, мы можем использовать любое допустимое выражение, включая переменные. Предположим, что = 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.
Это может быть интересно
Altium Designer my Libraries, Project templates, System settings by Catcatcat V24.0 PROViews: 553 Назвемо цей варіант поновлення для професіоналів і не тільки. Що нового? 1. Повністю змінено структуру параметрів бази даних компонента. Це дозволило повноцінної роботи Актив ВОМ. Ви відразу отримуєте …
Development of temperature control and management systemsViews: 244 Catcatcat Electronics Пошта для контакту e-mail: catcatcat.electronics@gmail.com
The art of DJViews: 255 The art of DJ. The art of DJ has gained wide popularity. Today, a DJ is not just someone whose task is to mix tracks; a DJ is …
Проект с использованием MCC часть 09Views: 1067 Эта часть будет посвящена созданию практического проекта управления освещение. Тех задание: Два выхода управления ШИМ – светодиодным освещением. Две кнопки управления, каждая кнопка управляет, своим каналом, логика самая …
PIC18 – модуль DMAViews: 1366 Введение Модуль прямого доступа к памяти (DMA) предназначен для обслуживания передачи данных непосредственно между различными областями памяти без вмешательства процессора. Исключив при этом необходимость в интенсивной обработки …
Development Boards PIC18F47Q84Views: 8466 Microchip тішить новими мікроконтролерами. Особливістю цього MCU – це багата інтелектуальна периферія, що дозволяє вирішувати такі завдання на 8 бітних MCU, які неможливо реалізувати на деяких навіть 32 …
Altium Designer my setup system and project structure V23.3Views: 443 Оновлення бази даних та шаблонів від березня 2023 року. Updating the database and templates from March 2023. Altium Designer my Libraries, Project templates, System settings by Catcatcat. Дивись …
Kitchen timer with contactless gesture controlViews: 817 Кухонний таймер з безконтактним керуванням жестами дозволяє встановити необхідний період часу для приготування страв, не торкаючись пристрою. Дуже зручно під час приготування їжі, коли руки забрудниться. Усі …
Индикатор температурыViews: 2845 Проект для начинающих, на демо плате BB-2T3D-01. Простой индикатор температуры. Проект никак не задумывался, просто на витрину магазин Ворон нужна была демонстрационная модель на макетной плате, чего нибудь работающего. Остановились на индикаторе …
Обновление ESP8266 c ESPFlashDownloadTool_v3.6.3Views: 3732 Технология обновления следующая: Загружаем программу со страницы espressif.com. Разархивируем. Где находятся файлы, для прошивки? Заходим в каталоги Подключаем по схеме в статье WiFi ESP8266 (замыкаем BT2, перемычка). Запускаем программу, …