Битовые операции

Admin 09.02.2015

Доброго дня уважаемые друзья!
Приветствую Вас на сайте «Мир микроконтроллеров»


Битовые операции

Логические битовые (побитовые) операции
Битовые операции сдвига

В прошлой статье была рассмотрена тема логических операций и выражений. В этой статье мы рассмотрим логические битовые операции. Битовые операции очень близки к логическим операциям, можно даже сказать, что это одно и тоже. Разница только в том,что логические операции применяются к высказываниям, а битовые операции, с такими же правилами и результатами применяются к битам.

Битовые операции, побитовые операции
Битовые операции играют не последнюю роль в программе, позволяют более проще и практичнее реализовать замыслы программиста. Поэтому, бояться выражения «битовые операции» и их самих не надо, тем более, что страшное и не понятное в них — только в названии. А я постараюсь как можно подробнее рассказать и о битовых операциях, и об их применении в практике программистов.
Ряд источников по языкам низкого уровня называет побитовые логические операции просто логическими, но в терминологии программирования на языках высокого уровня в названиях битовых операций присутствуют прилагательные битовый, побитовый, поразрядный.

В распространённых языках программирования встроенными средствами реализуются только четыре побитовые (битовые) логические операции: И, ИЛИ, НЕ и исключающее ИЛИ. Для задания произвольной побитовой логической операции вполне достаточно перечисленных операций. 

Чтобы мы не путались с выражениями «битовая операция» и «побитовая операция», запомним, что выполнение битовой операции — это выполнение побитовых операций с отдельными битами, и в дальнейшем я буду просто писать — «битовая операция» или «логическая операция».

Кроме того, читая техническую литературу вы наверняка столкнетесь с терминами «унарная операция» и «бинарная операция».
Унарная операция — операция над одним операндом (Битовая операция «НЕ»).
Бинарная операция — операция с двумя операндами (Битовые операции «И», «ИЛИ», «ИСКЛЮЧАЮЩЕЕ ИЛИ»)

И еще, регистр общего назначения (R0…R31) я буду обозначать аббревиатурой РОН.


Битовые (побитовые) логические операции

Битовая операция НЕ:

Если бит равен «1», то после выполнения операции он будет равен «0». И наоборот, если бит равен «0», то после выполнения операции он будет равен «1». (операция выполняется одновременно над всеми битами РОН). В качестве операнда может использоваться только РОН

Обозначается знаком «~»

Битовая операция НЕКроме инвертирования состояния битов регистра, битовая операция НЕ, применяется для нахождения дополнительного кода числа (из положительного числа — сделать отрицательное). Для этого необходимо число проинвертировать и к полученному результату прибавить единицу.

Дополнительный код, как и прямой и обратный коды — наиболее распространённые способы представления десятичных чисел в двоичном коде. Это вопрос будет рассмотрен в отдельной статье.


Битовая операция И:

Если оба соответствующих бита операндов равны 1, результирующий двоичный разряд равен 1; если же хотя бы один бит из пары равен 0, результирующий двоичный разряд равен 0. В качестве операндов могут использоваться два РОН или РОН и константа (число, записанное в памяти МК)

Обозначается знаком «&»

Битовая операция И

 Практическое применение:
— для сброса конкретного бита (битов) в ноль:

Сброс бита в ноль
— для проверки бита на 0 или 1, оно же чтение конкретного бита (если результат равен 0, значит бит равен 0, иначе бит равен 1):

Проверка бита на ноль
— проверка четности числа (четность — способность числа делиться на два)
У чётных чисел первый бит (самый правый) всегда равен нулю, а в нечётных единице:

Проверка на четность


Битовая операция ИЛИ

Если оба соответствующих бита операндов равны 0, двоичный разряд результата равен 0; если же хотя бы один бит из пары равен 1, двоичный разряд результата равен 1.  В качестве операндов могут использоваться два РОН или РОН и константа

Обозначается знаком «|» (вертикальная палочка)

Битовая операция ИЛИ


 

Битовая операция ИСКЛЮЧАЮЩЕЕ ИЛИ

Результат действия выполнения операции равен 1, если число складываемых единичных битов нечётно и равен 0, если чётно. В качестве операндов могут использоваться только РОН

Обозначается знаком «^»

Битовая операция исключающее ИЛИ

Практическое применение:
— для инвертирования битов регистра по маске

Инвертирование бита регистра по маске— определения равенства регистров (если результат равен нулю, значит содержимое регистров равно, иначе — не равно):

Определение равенства регистров


Битовые операции сдвига

В системе команд микроконтроллеров AVR есть несколько битовых операций, которые трудно однозначно отнести к разделу только логических операций, они вполне могут найти себе место и в разделе арифметических операций (вернее, они там и находятся). Таких операций три:
— логический сдвиг
— арифметический сдвиг
— циклический сдвиг  через бит переноса
Мы рассмотрим только операции, относящиеся к логическому сдвигу, а операции арифметического и циклического сдвига — в статьях по командам микроконтроллера.
Битовые операции сдвига, относящиеся к логическому сдвигу:
— логический сдвиг влево
— логический сдвиг вправо


Логический сдвиг влево

При логическом сдвиге влево происходит сдвиг всех разрядов регистра влево на одну позицию, старший бит (самый левый) при этом теряется, а в младший (самый правый) записывается 0.

Обозначается знаком «<<«

Логический сдвиг влево
Логический сдвиг влево в основном используется как арифметическая операция для целочисленного умножения на 2.
На рисунке вверху показана выполненная два раза операция «логический сдвиг влево» — произведено два сдвига содержимого байта влево.
При этом:
— старшие биты, (выделены красным цветом) уходят в небытие (теряются)
— освободившиеся места младших битов заполняются «0» (выделены синим цветом)

Давайте посмотрим что получилось:
— первоначальное значение регистра 0000 0101 = 5 (в десятичной системе)
— первый сдвиг влево — получаем 0000 1010 = 10
— второй сдвиг влево — получаем 0001 0100 = 20
— а если произвести третий сдвиг — получим 0010 1000 = 40
Как видите, в результате каждого сдвига регистра, происходит умножение на два. Таким образом если нам надо умножить содержимое регистра на 8 (2 в степени 3), нам надо произвести 3 сдвига влево. А если надо умножить на 16 (2 в степени 4) — то 4 сдвига.
При этом надо учитывать, что число на которое можно умножить содержимое регистра должно быть равно «2 в степени n».

Это был пример сдвига как арифметической операции. Применение сдвига как логической операции — тут огромный простор для фантазии. Для примера — записываем в регистр 0000 0001, выводим содержимое в любой порт к выводам которого подсоединены светодиоды, — загорается первый светодиод, производим сдвиг — первый гаснет, зажигается второй (логическая единица переместилась на один разряд), результат — бегущий огонь на выходе.


Логический сдвиг вправо

При логическом сдвиге вправо происходит сдвиг всех разрядов регистра вправо на одну позицию, младший бит (самый правый) при этом теряется, а в старший (самый левый) записывается 0

Обозначается знаком  «>>»

Логический сдвиг вправо

Логический сдвиг вправо используется как арифметическая операция для целочисленного деления на 2.

На рисунке вверху показана выполненная два раза операция «логический сдвиг вправо» — произведено два сдвига содержимого байта вправо.
При этом:
— младшие биты, а они выделены красным цветом, уходят в небытие (теряются)
— освободившиеся места старших битов заполняются «0» (выделены синим цветом)

Первоначальное число, записанное в регистр — 00100101 = 37 (десятичное)
— первый сдвиг — получаем 0001 0010 = 18
— второй сдвиг — получаем 0000 1001 = 9
При логическом сдвиге вправо происходит деление целочисленного числа на 2. При этом, как вы видите, если число нечетное (37), то при делении на 2 оно как-бы округляется в меньшую сторону (18). При этом надо учитывать, что число на которое можно разделить содержимое регистра должно быть равно «2 в степени n».


Предыдущие статьи:
1. Микроконтроллеры — первый шаг
2. Системы счисления: десятичная, двоичная и шестнадцатиричная
3. Логические операции, логические выражения, логические элементы
Следующие статьи:
1. Прямой, обратный и дополнительный коды двоичного числа


(23 голосов, оценка: 4,96 из 5)
Загрузка...
Битовые операции: логические, арифметические, циклические
Published by: Мир микроконтроллеров
Date Published: 02/09/2015

Комментарии

Битовые операции — 10 комментариев

  1. Добрый день!
    начал читать книгу Мортона АВР вводный курс.Возникла уйма вопросов на которые хотелось бы получить ответы.

  2. Здравствуйте.
    В конце пункта про логический сдвиг влево у вас пример про светодиоды. Хотелось бы уточнить физику процесса. Если я правильно понял пример, то у нас в порту, грубо говоря, есть 8 штырьков и к каждому подцеплена нога светодида. У каждого штырька свой диод (сидят они все на общем минусе, дабы не вызвать разности потенциалов между разными «землями»). И по очереди на каждый из штырьков подается единичка ? То есть единичка двигается влево, при этом на подцепленный к штырьку контакт прикладывается некий плюс (скажем 5 Вольт) ?
    Поясните пожалуйста, если я не правильно что то понимаю.

    • Здравствуйте Владимир!
      Да, все правильно.
      Заканчиваю статью по программированию на Си и Ассемблере, где будут рассмотрены все команды МК для управления «ножками», к которым можно подцепить что угодно, и управлять можно не только высоким напряжением (5 Вольт), но и низким (0 Вольт). Есть очень хорошие книги Рюмика С.М. — «1000 и одна микроконтроллерная схема» (2 части), в интернете можно найти (на сайте, к сожалению, я выложить их не могу, сразу придет письмо с обвинениями в нарушении авторских прав)

  3. Извиняюсь ну что за маразмат писал статью для начинающих, я вроде как в электронике с грехом пополам начинающий 2000 год обучения и на этом закончивший читая пытаюсь понять….Начиная со второй главы Я потерялся!! ЛЮДИ ЧИТАЮТ , а не КН.

    • Здравствуйте Владимир!
      Извините, но судя по стилистике и грамматике Вы не далеко ушли от меня — «маразматика». Если что-то непонятно — пишите по существу, я подправлю статью.
      С уважением, Admin.

      • Просто сделайте содержание немного «жиже» и замените необъяснённые термины «опирант и т.п.»
        Лично мне, человеку «погрызшему гранит науки «, а именно по части электроники, понятно всё (за что огромное спасибо) .

        Далее как предложение об улучшении — краткий перечень терминов в конце статей.

    • Извиняюсь перепутал, точнее в Битовой операции ИЛИ, «необходимо установить 2 и 3 биты в «1».

      • Здравствуйте Кодя!
        Извините, сразу не заметил Ваш комментарий.
        Да, Вы правы, там ошибка в результате, поэтому этот пример удаляю до устранения ошибки.
        С уважением, Admin.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *