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

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

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

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

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

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

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

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

И еще, регистр общего назначения (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. Прямой, обратный и дополнительный коды двоичного числа


(29 голосов, оценка: 4,97 из 5)

Загрузка...


Битовые операции: логические, арифметические, циклические
Published by: Мир микроконтроллеров
Date Published: 02/09/2015



Комментарии

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

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

  2. Владимир большое спасибо что пишете на понятном языке.Пока думаю отдохнуть т.к. надо усвоить пройденое

  3. Здравствуйте! Когда будет устранена ошибка и появится пример? 3 года прошло уж

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

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

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

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

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

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

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

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

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

        • Здравствуйте! Когда будет устранена ошибка и появиться пример? 3 года прошло уж

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

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