Битовые операции
Логические битовые (побитовые) операции
Битовые операции сдвига
В прошлой статье была рассмотрена тема логических операций и выражений. В этой статье мы рассмотрим логические битовые операции. Битовые операции очень близки к логическим операциям, можно даже сказать, что это одно и тоже. Разница только в том,что логические операции применяются к высказываниям, а битовые операции, с такими же правилами и результатами применяются к битам.
Битовые операции играют не последнюю роль в программе, позволяют более проще и практичнее реализовать замыслы программиста. Поэтому, бояться выражения "битовые операции" и их самих не надо, тем более, что страшное и не понятное в них - только в названии. А я постараюсь как можно подробнее рассказать и о битовых операциях, и об их применении в практике программистов.
Ряд источников по языкам низкого уровня называет побитовые логические операции просто логическими, но в терминологии программирования на языках высокого уровня в названиях битовых операций присутствуют прилагательные битовый, побитовый, поразрядный.
В распространённых языках программирования встроенными средствами реализуются только четыре побитовые (битовые) логические операции: И, ИЛИ, НЕ и исключающее ИЛИ. Для задания произвольной побитовой логической операции вполне достаточно перечисленных операций.
Чтобы мы не путались с выражениями "битовая операция" и "побитовая операция", запомним, что выполнение битовой операции - это выполнение побитовых операций с отдельными битами, и в дальнейшем я буду просто писать - "битовая операция" или "логическая операция".
Кроме того, читая техническую литературу вы наверняка столкнетесь с терминами "унарная операция" и "бинарная операция".
Унарная операция - операция над одним операндом (Битовая операция "НЕ").
Бинарная операция - операция с двумя операндами (Битовые операции "И", "ИЛИ", "ИСКЛЮЧАЮЩЕЕ ИЛИ")
И еще, регистр общего назначения (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. Прямой, обратный и дополнительный коды двоичного числа
Пока не понятно, как эту информацию использовать, однако написано все довольно доступно. Ваши уточнения в скобках и пояснения очень помогают. Вам спасибо за труд. Читаю дальше
Спасибо что оценили наш труд. Но здесь спасибо нужно говорить предыдущему админу нашего сайта, а он почему то к нам уже долго не заходит. А раньше заходил, отвечал на комментарии
Результат операции ИЛИ-НЕ или ИЛИ от всех битов двоичного регистра проверяет, равно ли значение регистра нулю; то же самое, взятое от выхода искл. ИЛИ двух регистров, проверяет равенство их значений между собой.
Извините, это вы ошибку или опечатку в статье нашли?
Владимир большое спасибо что пишете на понятном языке.Пока думаю отдохнуть т.к. надо усвоить пройденое
Здравствуйте! Когда будет устранена ошибка и появится пример? 3 года прошло уж
Добрый день!
начал читать книгу Мортона АВР вводный курс.Возникла уйма вопросов на которые хотелось бы получить ответы.
Не смог найти ошибку. Прошу Кодя пояснить
Здравствуйте.
В конце пункта про логический сдвиг влево у вас пример про светодиоды. Хотелось бы уточнить физику процесса. Если я правильно понял пример, то у нас в порту, грубо говоря, есть 8 штырьков и к каждому подцеплена нога светодида. У каждого штырька свой диод (сидят они все на общем минусе, дабы не вызвать разности потенциалов между разными "землями"). И по очереди на каждый из штырьков подается единичка ? То есть единичка двигается влево, при этом на подцепленный к штырьку контакт прикладывается некий плюс (скажем 5 Вольт) ?
Поясните пожалуйста, если я не правильно что то понимаю.
Здравствуйте Владимир!
Да, все правильно.
Заканчиваю статью по программированию на Си и Ассемблере, где будут рассмотрены все команды МК для управления "ножками", к которым можно подцепить что угодно, и управлять можно не только высоким напряжением (5 Вольт), но и низким (0 Вольт). Есть очень хорошие книги Рюмика С.М. - "1000 и одна микроконтроллерная схема" (2 части), в интернете можно найти (на сайте, к сожалению, я выложить их не могу, сразу придет письмо с обвинениями в нарушении авторских прав)
Извиняюсь ну что за маразмат писал статью для начинающих, я вроде как в электронике с грехом пополам начинающий 2000 год обучения и на этом закончивший читая пытаюсь понять....Начиная со второй главы Я потерялся!! ЛЮДИ ЧИТАЮТ , а не КН.
Здравствуйте Владимир!
Извините, но судя по стилистике и грамматике Вы не далеко ушли от меня - "маразматика". Если что-то непонятно - пишите по существу, я подправлю статью.
С уважением, Admin.
Просто сделайте содержание немного "жиже" и замените необъяснённые термины "опирант и т.п."
Лично мне, человеку "погрызшему гранит науки ", а именно по части электроники, понятно всё (за что огромное спасибо) .
Далее как предложение об улучшении - краткий перечень терминов в конце статей.
Админ, кажется в Битовой операции И, в "проверке на четность" ошибка.
Извиняюсь перепутал, точнее в Битовой операции ИЛИ, "необходимо установить 2 и 3 биты в "1".
Здравствуйте Кодя!
Извините, сразу не заметил Ваш комментарий.
Да, Вы правы, там ошибка в результате, поэтому этот пример удаляю до устранения ошибки.
С уважением, Admin.
Здравствуйте! Когда будет устранена ошибка и появиться пример? 3 года прошло уж