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.
Это может быть интересно
Одноканальный емкостной сенсор – AT42QT1012Views: 2475 Описание сенсора [wpdm_file id=242] Незаконченный проект, так-как сенсор не оправдал своего назначения, не рекомендую, просто выброшенные деньги. Особенности. • Количество сенсоров – один, режим переключения ( touch-on/touch-off ), а также программируемая …
HVLD модуль на примере PIC24FJ128GA204Views: 854 HVLD модуль представляет собой простое устройство, для контроля напряжения питания микроконтроллера или внешнего напряжения (через делитель). Его задача при “выходе” напряжения за заданные пределы сформировать сообщение микроконтроллеру, что …
ESP8266 применение в проектахViews: 3788 (Актуально только для версий прошивки 1.хх) ESP8266 показала себя как надежное и безотказное устройство для обмена данными с применением WIFI. Я использую ESP8266 исключительно через UART, с применением AT …
MPLAB® Code ConfiguratorViews: 1825 MPLAB ® Code конфигуратор (MCC) является свободно распространяемым плагином, это графическая среда программирования, которая генерирует бесшовный, легкий для понимания кода на Cи, чтобы вставить его в свой проект.
MCC – K42 – настройка модуля DMAViews: 1008 MCC – в версии v.3.95.0 и начиная ядра 4.85.0 конфигуратор предоставляет графический интерфейс для настройки модуля DMA. Для начала: Посмотреть какая версия МСС можно в закладке версии, если …
Проект с использованием MCC часть 13Views: 1250 Так как используя MCC мы можем его использовать со своими библиотеками, поэтому настало время и свое создать. Для начала откроем наш заголовочный файл в нем очень много букв: По …
Простой цифровой вольтметр ch-c3200Views: 2661 В этой статье рассмотрен пример создания простого вольтметра постоянного тока на основе печатной платы ch-c0030pcb, а при возможности использования внешнего делителя и вольтметр переменного тока. Дан краткий принцип …
NeoPixel LED и PIC18Views: 1922 Еще раз об управлении светодиодами на драйвере WS2812 и ему подобных. Как известно эти светики управляются по однопроводной шине. Основная особенность, что программно можно описать передачу данных, …
Development board based on MCU PIC18F47Q84Views: 2794 PIC18F47Q84 Microcontroller Family with CAN Flexible Data Status: In Production.
MPLAB® Harmony – или как это просто! Часть 2.Views: 2962 Часть вторая – Первая программа на PIC32. Музыкальная тема к статье, слушаем: Для начала изучения PIC32 надо иметь или демоплату или самому её изготовить имея микроконтроллер. Начнем из …