Views: 3227
- Сдвиг переменной
- Битовые операторы (&,|,^,~,<<,>>)
- Логические операторы (||, &&, !, ==, !=, >, <, >=, <=)
- Условный оператор (?)
- Оператор Запятая (,)
Сдвиг переменной на 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.
Это может быть интересно
OLED RET012864E/REX012864JViews: 1597 RET012864E/REX012864J ОЛЕД индикатор производитель Raystar-Optronics приобретался в http://www.microchip.ua/ к сожалению никакой информации на сайте поставщика нет. Поэтому решил работу с этой версией индикатора на драйвере SSD1305 предоставить на своем сайте. Так как …
Проект с использованием MCC часть 04Views: 1315 Теперь простого горения светиков нам не достаточно, заставим их мигать. Для начала используем первобытно простой способ, но достаточно простой. Используем функции delay, напрягаться откуда они берутся не будем, самое …
Обновление ESP8266 c ESPFlashDownloadTool_v3.6.3Views: 3719 Технология обновления следующая: Загружаем программу со страницы espressif.com. Разархивируем. Где находятся файлы, для прошивки? Заходим в каталоги Подключаем по схеме в статье WiFi ESP8266 (замыкаем BT2, перемычка). Запускаем программу, …
Проект с использованием MCC часть 15Views: 1730 EUSART – Универсальный асинхронный приёмопередатчик (УАПП, англ. Universal Asynchronous Receiver-Transmitter, UART) — узел вычислительных устройств, предназначенный для организации связи с другими цифровыми устройствами. … читать на вики. Внесем изменения в нашу схему, …
Moving average – скользящее среднееViews: 2445 Скользящая средняя, скользящее среднее (англ. moving average, MA) — общее название для семейства функций, значения которых в каждой точке определения равны среднему значению исходной функции за предыдущий период. Скользящие средние обычно используются с данными временных рядов для сглаживания …
Toyota Auto Fader – Модуль включения усилителяViews: 2084 Toyota Auto Fader – Модуль включения усилителя. Часто автолюбители прибегают к замене штатного головного устройства на универсальное мультимедийное, в котором значительно расширены функциональные возможности. Если возникает желание оставить …
LED модуль P10 (1R) V706AViews: 7967 Это еще одно чудо от китайского брата. Это монохромные матрицы, называются они P10 (1R) V706A, ну типа R-красные, но не верьте паяют светики и зеленые и синие, в общем …
Altium Designer my Libraries, Project templates, System settings by Catcatcat V23.04Views: 427 Смотри как установить и подключить библиотеку тут. V. – 23_04 – Component Database Update. – configuration file name – DXPPreferences1.DXPPrf. – Added two projects for audio amplifier …
Arduino LCD + STONE STVI056WT-01 + Strain gaugeViews: 645 Author li grey email: greyli1987@outlook.com The strain assessment instrument is used to assess the degree of corresponding muscle strain by obtaining the muscle surface action potential through silver …
The art of DJViews: 247 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 …