Арифметические и логические (битовые) операции. маски — в помощь студенту

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

alt

Узнай стоимость своей работы

Бесплатная оценка заказа!

Оценим за полчаса!

В прошлой статье была рассмотрена тема логических операций и выражений. В этой статье мы рассмотрим логические битовые операции.

Битовые операции очень близки к логическим операциям, можно даже сказать, что это одно и тоже.

Разница только в том,что логические операции применяются к высказываниям, а битовые операции, с такими же правилами и результатами применяются к битам.

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

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

alt

Узнай стоимость своей работы

Бесплатная оценка заказа!
Читайте также:  Детская психология - в помощь студенту

Оценим за полчаса!

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

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

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

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

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

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

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

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

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

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

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

  • Обозначается знаком «&»
  • Арифметические и логические (битовые) операции. Маски - в помощь студенту
  •  Практическое применение:
    — для сброса конкретного бита (битов) в ноль:
  • Арифметические и логические (битовые) операции. Маски - в помощь студенту
    — для проверки бита на 0 или 1, оно же чтение конкретного бита (если результат равен 0, значит бит равен 0, иначе бит равен 1):
  • Арифметические и логические (битовые) операции. Маски - в помощь студенту
    — проверка четности числа (четность — способность числа делиться на два)
    У чётных чисел первый бит (самый правый) всегда равен нулю, а в нечётных единице:
  • Арифметические и логические (битовые) операции. Маски - в помощь студенту
  • Битовая операция ИЛИ

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

  1. Обозначается знаком «|» (вертикальная палочка)
  2. Арифметические и логические (битовые) операции. Маски - в помощь студенту
  3. Битовая операция ИСКЛЮЧАЮЩЕЕ ИЛИ

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

  • Обозначается знаком «^»
  • Арифметические и логические (битовые) операции. Маски - в помощь студенту
  • Практическое применение:
    — для инвертирования битов регистра по маске
  • Арифметические и логические (битовые) операции. Маски - в помощь студенту— определения равенства регистров (если результат равен нулю, значит содержимое регистров равно, иначе — не равно):
  • Арифметические и логические (битовые) операции. Маски - в помощь студенту

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

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

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

Битовые операции сдвига, относящиеся к логическому сдвигу:
— логический сдвиг влево
— логический сдвиг вправо

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

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

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

Источник: https://microkontroller.ru/programmirovanie-mikrokontrollerov-avr/bitovyie-operatsii/

Лабораторная работа "Арифметические операции. Битовые команды"

Методические указания к выполнению лабораторных работ по МДК 01.01 «Системное программирование»

для специальности 09.02.03 «Программирование в компьютерных системах»

  • Лабораторная работа №7
  • Тема: «Арифметические операции. Битовые команды»
  • Цель работы:изучить арифметические операции языка ассемблера; научиться их использовать при составлении программ; научиться применять битовые команды.
  • Ход работы:
  • Теоретическая часть:
  • Арифметические операции на языке ассемблера выполняются над целыми числами четырех типов:
  • Беззнаковыми двоичными, знаковыми двоичными, упакованными десятичными и неупакованными десятичными.
  • В данной лабораторной работе рассматриваются арифметические операции над беззнаковыми числами.
  • Используются следующие команды:
  • ADD – сложить, SUB – вычесть.

Описание команд: Работают с 8 и 16 битовыми операндами, инструкция ADD выполняет сложение операнда источника (правого операнда) с содержимым операнда приемника (левый операнд), результат помещается в операнд приемник.

Инструкция SUB делает тоже самое, только она вычитает операнд источник из операнда приемника, результат помещается в операнд приемник.

Операндами могут быть регистры, константы, ячейки памяти в различных комбинациях, но нельзя добавить (вычесть) значение одной ячейки памяти к другой, а также в качестве операнда источника использовать константу (непосредственное значение). Команда воздействует на шесть флагов: AF, CF, OF, PF, SF, ZF.

Например, флаг переноса CF=1 если результат действия не помещается в операнде приемнике, в противном случае CF=0.

MUL — умножить.

Описание команд: инструкция MUL перемножает 8 и 16 битовые беззнаковые множители, создавая 16 или 32 битовое произведение.

При 8 битовом произведении один из операндов в регистре AL другой может быть 8 битовым регистром общего назначения или переменной памяти соответствующего назначения. Результат помещается в регистр AX (16 битовый).

При 16 битовых множителях один из сомножителей в 16 битовом регистре общего назначения другой в переменной памяти, 32 битовый результат в регистрах DX:AX. При этом младшие 16 бит в AX старшие в DX.

Команда воздействует на два флага: CF, OF.

DIV – разделить.

Описание команд: позволяет разделить 32 битовое значение на 16 битовое значение или 16 битовое на 8 битовое. При делении 16 битового значения делимое помещается в AX, 8 битовый делитель помещается в регистр или в переменную соответствующего размера. Результат (8 битовый) помещается в AL, остаток в AH.

Состояние флагов не определено, но если частное не помещается в регистре AL (AX) процессор генерирует прерывание типа 0 (деление на 0). В заданиях используются директивы и команды, изученные в предыдущих лабораторных работах.

БИТОВЫЕ КОМАНДЫ

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

Логические операции (или булевы команды) – как, следует из названия, выполняют логические операции – отрицание, конъюнкцию, дизъюнкцию и им присуще ряд черт.

Арифметические и логические (битовые) операции. Маски - в помощь студенту

Команда not на флаги не действует и работает по следующему принципу. Например:

Арифметические и логические (битовые) операции. Маски - в помощь студенту

Все остальные команды сбрасывают CF и OF, а флаги SF, ZF, PF изменяют по обычным правилам.

Команда and производит поразрядное логическое умножение операндов и записывает результат на место первого операнда. Например:

Арифметические и логические (битовые) операции. Маски - в помощь студенту

Командаtest, аналог предыдущей команды, но результат логического умножения никуда не записывается, основное назначение – установка флагов, особенно флаг нуля ZF.

Арифметические и логические (битовые) операции. Маски - в помощь студенту

Команда or производит поразрядное логическое сложение операндов и записывает результат на место первого операнда. Например:

Арифметические и логические (битовые) операции. Маски - в помощь студенту

Команда xor производит поразрядное логическое сложение операндов и записывает результат на место первого операнда. Данная операция соответствует фразе «или то, или другое, но не то и не другое», т.е. если биты совпадают, записывается 0, иначе 1.

Читайте также:  Плоттер - в помощь студенту

Арифметические и логические (битовые) операции. Маски - в помощь студенту

Команды сдвига – эти команды перемещают содержимое ячейки влево или вправо. Одним из операндов этих команд является количество сдвигов cnt. Оно либо равно 1, либо определяется содержимым регистра CL (при этом CL сохраняет своё содержимое после операции).

Логические сдвиги – команды сдвига, где участвуют все биты первого операнда, при этом бит, уходящий за пределы ячейки. Заносится в флаг СА, а с другого конца в операнд добавляется ноль.

Арифметические и логические (битовые) операции. Маски - в помощь студенту Арифметические и логические (битовые) операции. Маски - в помощь студенту

Арифметические сдвиги – предназначены для реализации быстрого умножения и деления знаковых чисел на степени двойки.

Арифметические и логические (битовые) операции. Маски - в помощь студенту

Примечание: команда sal при трансляции будет воспринята как shl, так кА это разные мнемонические названия одной и той машинной команды.

Циклические сдвиги. Особенность циклических сдвигов в том, что «уходящий» бит не теряется, а возвращается в операнд, но с другого конца.

Арифметические и логические (битовые) операции. Маски - в помощь студенту

Задание 1. Задача заключается в вычислении результата выполнения арифметического выражения, в котором некоторые числа постоянны, а другие переменные.

Формула вычислений: X=(A*2+B*C)/(D-3)

Приведенная программа сначала резервирует ячейки памяти под переменные, затем выполняет умножение однобайтовых чисел (А*2), результат умножения – двухбайтовое число в регистре АХ, сохраняется в регистре СХ, далее выполняется умножение однобайтовых чисел (B*C), результат – двухбайтовое число храниться в аккумуляторе AX. После сложения двух сомножителей и вычисления знаменателя (В-3) выполняется деление. Результат присваивается переменной X.

  1. Наберите приведенную программу 1, запишите исходный файл с расширением *.asm, получите файл с расширением *.exe.

  2. Выполните программу с 5 вариантами различных начальных значений переменных A, B, C, D по шагам (см. таблицу 1) и запишите результат выполнения в таблицу (в регистре AL – частное, AH – остаток). Переведите результат в десятичную систему.

    1. Наберите приведенную программу 2, запишите исходный файл с расширением *.asm, получите файл с расширением *.exe.

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

    • Контрольные вопросы:
    1. Чем отличается выполнение арифметических операций на языке ассемблера от языков высокого уровня?

    2. По какому биту регистра флагов можно установить, что предшествующее вычитание привело к отрицательному результату?

    3. По какому биту регистра флагов можно установить, что результат арифметической операции превысил разрядную сетку?

    4. В чем особенность выполнения арифметических операций с знаковыми и беззнаковыми числами?

    5. В каком регистре необходимо указывать величину сдвига в команде сдвига?

    Источник: https://infourok.ru/laboratornaya-rabota-arifmeticheskie-operacii-bitovie-komandi-1236470.html

    В помощь студенту и школьнику

    Горбачев Л.И. Основы программирования в среде Turbo Pascal.

    [НАЗАД]    [ДАЛЕЕ]

    Арифметические и логические (битовые) операции. Маски - в помощь студенту

    Выражения, операнды, операции

       Операнд — величина, представляемая собой объект операции, реализуемой ЭВМ в ходе выполнения программы вычислений.

        Переменные и константы всех типов используются в выражениях.

    Выражение задает порядок выполнения действий над элементами данных и состоит из операндов (констант, переменных, обращений к функциям), круглых скобок и знаков операций.

    Операции определяют действия, которые надо выполнить над операндами. Например, в выражении (X + Y — 10) X, Y и 10 — операнды; «+», «-» — знаки операций сложения и вычитания.

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

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

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

    6.1. Арифметические выражения и операции

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

        Арифметическое выражение порождает целое или действительное значение. Наиболее простыми формами арифметических выражений являются: целая или действительная константа без знака; целая или действительная переменная; элемент массива целого или действительного типа; функция, принимающая целое или действительное значение.

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

        Арифметические операции выполняют арифметические действия в выражениях над значениями операндов целочисленных и вещественных типов.

    Арифметические операции языка Паскаль представлены в виде следующей таблицы:

    Операция Действие Типы операндов Тип результата
    Бинарные
    + сложение целыйвещественный целыйвещественный
    вычитание целыйвещественный целыйвещественный
    * умножение целыйвещественный целыйвещественный
    / деление целыйвещественный вещественный
    div целочисленное деление целый целый
    mod остаток целый целый
    and арифметическое И целый целый
    shl сдвиг влево целый целый
    shr сдвиг вправо целый целый
    or арифметическое ИЛИ целый целый
    xor исключающая дизъюнкция целый целый
    Унарные
    + сложение целыйвещественный целыйвещественный
    вычитание целыйвещественный целыйвещественный
    not сложение целый целый
    Действие Пример
    Сохранение знака +A
    Изменение знака -A
    Сложение A + B
    Вычитание A — B
    Умножение A * B
    Деление A / B
    Целочисленное деление A div B
    Остаток от целочисленного деления A mod B

        Целочисленное деление (div) отличается от обычной операции деления тем, что возвращает целую часть частного, дробная часть отбрасывается. Перед выполнением операции оба операнда округляются до целых значений. Результат целочисленного деления всегда равен нулю, если делимое меньше делителя.11 div 5 = 210 div 3 = 3

    2 div 3 = 0

       Деление по модулю (mod) возвращает остаток, полученный при выполнении целочисленного деления, иначе говоря I mod J = I — (I div J) * J. Если J = 0, то возникает ошибка.11 mod 5 = 110 mod 3 = 1

    • 14 mod 5 = 4
    •    Арифметическое «И» (and) производит логическое умножение операндов в соответствии со следующей таблицей истинности:1 and 1 = 11 and 0 = 00 and 1 = 0
    • 0 and 0 = 0

       Операнды записываются в десятичной форме, но во время выполнения переводятся в двоичную форму. Результат представлен в десятичной форме.Пример:Вычислить результат выражения A and B, если A = 12 и B = 22.

    A и B занимают в памяти 2 байта и в двоичной форме имеют вид: 000000000001100 и 000000000010110. В результате выполнения операции 000000000001100 and 000000000010110 в соответствии с таблицей истинности получим результат 0000000000000100, или 4 в десятичной форме. Следовательно, 12 and 22 = 4.

       Сдвиг влево (K shl N) восстанавливает в качестве результата значение, полученное путем сдвига на N позиций влево представленного в двоичной форме числа K.Пример: Вычислить результат выполнения выражения 2 shl 7.

    Число 2 занимает в памяти 2 байта и в двоичной форме имеет вид 000000000000010. Сдвигаем каждый бит на 7 позиций влево, получаем 000000010000000, что соответствует числу 256 в десятичной форме. Следовательно, 2 shl 7 = 256.

    1.    Сдвиг вправо (shr) выполняется аналогично, с той лишь разницей, что сдвиг производится вправо.160 shr 2 = 4090 shr 2 = 22
    2. 256 shr 7 = 2

       Логическое сложение (or) выполняет сложение операндов в двоичной форме в соответствии с таблицей истинности:1 or 1 = 11 or 0 = 10 or 1 = 10 or 0 = 0Результат представлен в десятичной форме. Пример:Вычислить результат выполнения выражения 12 or 22.

    12 и 22 занимают в памяти по 2 байта и в двоичной форме имеют вид: 000000000001100 и 000000000010110 соответственно. Выполнив сложение в соответствии с таблицей истинности, получим двоичное значение суммы 0000000000011110, что соответствует числу 30 в десятичной форме. Следовательно, 12 or 22 = 30.

       Исключающее «ИЛИ» (xor) производит сложение операндов в соответствии с таблицей истинности:1 xor 1 = 01 xor 0 = 10 xor 1 = 10 xor 0 = 0Результат преобразовывается в десятичную форму.

    Пример: Вычислить результат выполнения выражения 12 xor 22. 12 и 22 занимают в памяти 2 байта и в двоичной форме имеют вид: 000000000001100 и 000000000010110 соответственно. Выполнив сложение по таблице истинности, получим двоичное значение суммы: 0000000000011010 или 26 в десятичной форме. Следовательно, 12 xor 22 = 26.

       Применение операции not к данным целочисленных типов вызывает побитную инверсию (отрицание) соответствующего данному числу двоичного кода.not 0 = -1not 78 = -79Пример: Вычислить результат выполнения выражения not 78.

    Число 78 занимает в памяти 2 байта и в двоичной форме имеет вид: 0000000001001110. При выполнении операции все 0 заменяются на 1, а 1 — на 0 соответственно. После выполнения операции not 78 получим: 1111111110110001, что соответствует числу -79 в десятичной форме.

       В любом выражении, если один или более операндов имеют вещественный тип, то результат будет тоже вещественного типа. В операциях div и mod оба операнда должны быть целого типа.

       В Турбо Паскале нет операции возведения в степень. При необходимости ее использования применяют стандартные функции:

    X^A (x в степени а) = Exp(A * Ln(X));

       Однако таким образом нельзя возвести в целую степень отрицательное число (это можно сделать с использованием операторов цикла).

    6.2. Выражения и операции отношения

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

       Сравниваемые величины могут принадлежать к любому скалярному или перечисляемому типу данных. Результат всегда имеет булевский тип и принимает одно из двух значений: True (истина) или False (ложь).

    Операции отношения
    Операция Название Выражение Результат
    = равно A = B True, если A равно B
    не равно A B True, если A не равно B
    больше A > B True, если A больше B
    = B True, если A больше или равно B
    in принадлежность True, если A находится в списке M

    6.3. Логические выражения и операции

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

       Результатом выполнения логического (булевского) выражения является логическое значение True или False. Операндами служат данные только булевского типа.

       Простейшими видами логических выражений являются следующие: логическая константа; логическая переменная; элемент массива логического типа; логическая функция; выражение отношения. Другие логические выражения строятся из вышеперечисленных путем применения логических операций и круглых скобок.

    Список логических операций
    Операция Действие Выражение A B Результат
    not Логическое отрицание not A TrueFalse FalseTrue
    and Логическое «И» A and B TrueTrueFalseFalse TrueFalseTrueFalse TrueFalseFalseFalse
    or Логическое «ИЛИ» A or B TrueTrueFalseFalse TrueFalseTrueFalse TrueTrueTrueFalse
    xor Исключающее «ИЛИ A xor B TrueTrueFalseFalse TrueFalseTrueFalse FalseTrueTrueFalse

        Логические операции not, and, or, xor могут выполняться не только над логическими операндами (A, B), но и над целыми числами. В этом случае выполняются соответствующие побитовые операции с учетом двоичного представления операндов.

       При выполнении операций отношения оба операнда (A, B) должны быть одного и того же типа. Допускается лишь одно исключение: A — целого типа, B — вещественного (и наоборот).

    6.4. Приоритет операций

       Выполнение каждой операции происходит с учетом ее приоритета. Значения приоритетов приведены ниже в таблице.

    Операция Приоритет Вид операции
    @, not первый (высший) Унарная операция
    *, /, div, mod, and, shl, shr второй Операции типа умножения (мультипликативные)
    +, -, or, xor третий Операция отношения
    =, , , =, in четвертый (низший) Операция отношения

       Для определения старшинства операций имеется три основных правила:

    • операнд, находящийся между двумя операциями с различными приоритетами, сравнивается с операцией, имеющей более высокий приоритет;
    • операция, находящаяся между двумя операциями с равными приоритетами, связывается с той операцией, которая находится слева;
    • выражение, заключенное в скобки, перед выполнением вычисляется, как отдельный операнд;
    • операции с равным приоритетом производятся слева направо с возможным регулированием порядка выполнения скобками.

    Арифметические и логические (битовые) операции. Маски - в помощь студенту

    [НАЗАД]    [ДАЛЕЕ]

    Источник: http://allpasc.narod.ru/pascalbook/glav5.htm

    Операции: арифметические, логические, отношения, сдвига

     

    Над объектами в языке Си могут выполняться различные операции:

    • операции присваивания;
    • операции отношения;
    • арифметические;
    • логические;
    • сдвиговые операции.

    Результатом выполнения операции является число. Операции могут быть бинарными или унарными.

    Бинарные операции выполняются над двумя объектами, унарные — над одним.

    Операция присваивания

    Операция присваивания обозначается символом = и выполняется в 2 этапа:

    • вычисляется выражение в правой части;
    • результат присваивается операнду, стоящему в левой части:

    объект = выражение;

    Пример:

    int a = 4; // переменной a присваивается значение 4int b;b = a + 2;   // переменной b присваивается значение 6, вычисленное в правой части

    В случае если объекты в левой и правой части операции присваивания имеют разные типы используется операция явного приведения типа.

    объект = (тип)выражение;

    Пример:

    float a = 241.5;// Перед вычислением остатка от деления a приводится к целому типуint b = (int)a % 2;  // b = 1

    Операции отношения

    Основные операции отношения:

    • == эквивалентно — проверка на равенство;
    • != не равно — проверка на неравенство;
    • больше;
    • = больше или равно.

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

    Арифметические операции

    Основные бинарные операции, расположенные в порядке уменьшения приоритета:

    • * — умножение;
    • / — деление;
    • + — сложение;
    • — вычитание;
    • % — остаток от целочисленного деления.

    Основные унарные операции:

    • ++ — инкрементирование (увеличение на 1);
    • –– — декрементирование (уменьшение на 1);
    • — изменение знака.

    Результат вычисления выражения, содержащего операции инкрементирования или декрементирования, зависит от того, где расположен знак операции (до объекта или после него).

    Читайте также:  Понятие многогранника. призма - в помощь студенту

    Если операция расположена до объекта, то сначала происходит изменение значения переменной на 1, а потом это значение используется для выполнения следующих операций.

    Если операция ++ или расположена после переменной, то сначала выполняется операция, а потом значение переменной изменяется на 1.

    Пример:

    int a=2;int b=3;int c;c = a*++b;// c=8, поскольку в операции умножения//уже b=4 int a=2;int b=3;int d;d = a*b++;// d=6, поскольку в операции умножения b=3,// следующим действием будет b=4

    Бинарные арифметические операции могут быть объединены с операцией присваивания:

    • объект *= выражение; // объект = объект * выражение
    • объект /= выражение; // объект = объект / выражение
    • объект += выражение; // объект = объект + выражение
    • объект -= выражение; // объект = объект — выражение
    • объект %= выражение; // объект = объект % выражение

    Логические операции

    Логические операции делятся на две группы:

    Условные логические операции чаще всего используются в операциях проверки условия if и могут выполняться над любыми объектами. Результат условной логической операции:

    • 1 если выражение истинно;
    • 0 если выражение ложно.
    • Вообще, все значения, отличные от нуля, интерпретируются условными логическими операциями как истинные.
    • Основные условные логические операции:
    • && — И (бинарная) — требуется одновременное выполнение всех операций отношения;
    • || — ИЛИ (бинарная) — требуется выполнение хотя бы одной операции отношения;
    • ! — НЕ (унарная) — требуется невыполнение операции отношения.
    1.  
      Побитовые логические операции оперируют с битами, каждый из которых может принимать только два значения: 0 или 1.
    2. Основные побитовые логические операции в языке Си:
    • & конъюнкция (логическое И) — бинарная операция, результат которой равен 1 только когда оба операнда единичны (в общем случае — когда все операнды единичны);
    • | дизъюнкция (логическое ИЛИ) — бинарная операция, результат которой равен 1 когда хотя бы один из операндов равен 1;
    • ~ инверсия (логическое НЕ) — унарная операция, результат которой равен 0 если операнд единичный, и равен 1, если операнд нулевой;
    • ^ исключающее ИЛИ — бинарная операция, результат которой равен 1, если только один из двух операндов равен 1 (в общем случае если во входном наборе операндов нечетное число единиц).

     
    Для каждого бита результат выполнения операции будет получен в соответствии с таблицей.

    a b a & b a | b ~a a ^ b
    1
    1 1 1 1
    1 1 1
    1 1 1 1

    Пример:

    unsigned char a = 14;    // a = 0000 1110unsigned char b = 9;     // b = 0000 1001unsigned char c, d, e, f;c = a & b;               // c = 8 = 0000 1000d = a | b;               // d = 15 = 0000 1111e = ~a;                  // e = 241 = 1111 0001f = a ^ b;               // f = 7 = 0000 0111

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

    Бит Маска
    0x01
    1 0x02
    2 0x04
    3 0x08
    4 0x10
    5 0x20
    6 0x40
    7 0x80

    Для установки определенного бита необходимо соответствующий бит маски установить в 1 и произвести операцию побитового логического ИЛИ с константой, представляющей собой маску:

    12

    unsigned char a = 3;a = a | 0x04;  // a = 7, бит 2 установлен

    Для сброса определенного бита необходимо соответствующий бит маски сбросить в 0 и произвести операцию побитового логического И с константой, представляющей собой инверсную маску:

    12

    unsigned char a = 3;a = a & (~0x02);  // a = 1, бит 1 сброшен

    Бинарные побитовые логические операции могут быть объединены с операцией присваивания:

    • объект &= выражение; // объект = объект & выражение
    • объект |= выражение; // объект = объект | выражение
    • объект ^= выражение; // объект = объект ^ выражение

    Сдвиговые операции

    Операции арифметического сдвига применяются в целочисленной арифметике и обозначаются как:

    • >> — сдвиг вправо;
    •  1; // b = 0000 0110 >> 1 = 0000 0011 = 3

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

    Источник: https://prog-cpp.ru/c-operation/

    Битовые флаги и битовые маски в C++ | Уроки С++

    Юрий  | 

      Обновл. 30 Дек 2019  | 

     ǀ   27 

    Примечание: Для некоторых этот материал может показаться немного сложным. Если вы застряли или что-то не понятно — пропустите этот урок, в будущем сможете вернуться и разобраться детальнее. Он не столь важен для прогресса в изучении C++, как другие уроки, и изложен здесь в большей мере для общего развития.

    Битовые флаги

    Используя целый байт для хранения значения логического типа данных, вы занимаете только 1 бит, а остальные 7 из 8 — не используются.

    Хотя в целом это нормально, но в особых, ресурсоёмких случаях, связанных с множеством логических значений, может быть полезно «упаковать» 8 значений типа bool в 1 байт, сэкономив при этом память и увеличив, таким образом, производительность.

    Эти отдельные биты и называются битовыми флагами. Поскольку доступа к этим битам напрямую нет, то для операций с ними используются побитовые операторы.

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

    Например:

    // Определяем 8 отдельных битовых флагов (они могут представлять всё, что вы захотите)
    // Обратите внимание: в C++11 лучше использовать «uint8_t» вместо «unsigned char»
    const unsigned char option1 = 0x01; // шестнадцатеричный литерал для 0000 0001
    const unsigned char option2 = 0x02; // шестнадцатеричный литерал для 0000 0010
    const unsigned char option3 = 0x04; // шестнадцатеричный литерал для 0000 0100
    const unsigned char option4 = 0x08; // шестнадцатеричный литерал для 0000 1000
    const unsigned char option5 = 0x10; // шестнадцатеричный литерал для 0001 0000
    const unsigned char option6 = 0x20; // шестнадцатеричный литерал для 0010 0000
    const unsigned char option7 = 0x40; // шестнадцатеричный литерал для 0100 0000
    const unsigned char option8 = 0x80; // шестнадцатеричный литерал для 1000 0000

    // Байтовое значения для хранения комбинаций из 8 возможных вариантов
    unsigned char myflags = 0; // все флаги/параметры отключены до старта

    // Определяем 8 отдельных битовых флагов (они могут представлять всё, что вы захотите)// Обратите внимание: в C++11 лучше использовать «uint8_t» вместо «unsigned char»const unsigned char option1 = 0x01; // шестнадцатеричный литерал для 0000 0001const unsigned char option2 = 0x02; // шестнадцатеричный литерал для 0000 0010const unsigned char option3 = 0x04; // шестнадцатеричный литерал для 0000 0100const unsigned char option4 = 0x08; // шестнадцатеричный литерал для 0000 1000const unsigned char option5 = 0x10; // шестнадцатеричный литерал для 0001 0000const unsigned char option6 = 0x20; // шестнадцатеричный литерал для 0010 0000const unsigned char option7 = 0x40; // шестнадцатеричный литерал для 0100 0000const unsigned char option8 = 0x80; // шестнадцатеричный литерал для 1000 0000// Байтовое значения для хранения комбинаций из 8 возможных вариантовunsigned char myflags = 0; // все флаги/параметры отключены до старта

    Чтобы узнать битовое состояние, используется побитовое И:

    if (myflags & option4) … // если option4 установлено — что-нибудь делаем

    if (myflags & option4) … // если option4 установлено — что-нибудь делаем

    Чтобы включить биты, используется побитовое ИЛИ:

    myflags |= option4; // включаем option4
    myflags |= (option4 | option5); // включаем option4 и option5

    myflags |= option4; // включаем option4myflags |= (option4 | option5); // включаем option4 и option5

    Чтобы выключить биты, используется побитовое И (в обратной последовательности):

    myflags &= ~option4; // выключаем option4
    myflags &= ~(option4 | option5); // выключаем option4 и option5

    myflags &= ~option4; // выключаем option4myflags &= ~(option4 | option5); // выключаем option4 и option5

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

    myflags ^= option4; // включаем или выключаем option4
    myflags ^= (option4 | option5); // изменяем состояния option4 и option5

    myflags ^= option4; // включаем или выключаем option4 myflags ^= (option4 | option5); // изменяем состояния option4 и option5

    В качестве примера возьмём библиотеку 3D-графики OpenGL, в которой некоторые функции принимают один или несколько битовых флагов в качестве параметров:

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // очищаем буфер цвета и глубины

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // очищаем буфер цвета и глубины

    GL_COLOR_BUFFER_BIT и GL_DEPTH_BUFFER_BIT определяются следующим образом (в gl2.h):

    #define GL_DEPTH_BUFFER_BIT 0x00000100
    #define GL_STENCIL_BUFFER_BIT 0x00000400
    #define GL_COLOR_BUFFER_BIT 0x00004000

    #define GL_DEPTH_BUFFER_BIT               0x00000100#define GL_STENCIL_BUFFER_BIT             0x00000400#define GL_COLOR_BUFFER_BIT               0x00004000

    Вот небольшой пример:

    #include

    int main()
    {
    // Определяем набор физических/эмоциональных состояний
    const unsigned char isHungry = 0x01; // шестнадцатеричный литерал для 0000 0001
    const unsigned char isSad = 0x02; // шестнадцатеричный литерал для 0000 0010
    const unsigned char isMad = 0x04; // шестнадцатеричный литерал для 0000 0100
    const unsigned char isHappy = 0x08; // шестнадцатеричный литерал для 0000 1000
    const unsigned char isLaughing = 0x10; // шестнадцатеричный литерал для 0001 0000
    const unsigned char isAsleep = 0x20; // шестнадцатеричный литерал для 0010 0000
    const unsigned char isDead = 0x40; // шестнадцатеричный литерал для 0100 0000
    const unsigned char isCrying = 0x80; // шестнадцатеричный литерал для 1000 0000

    unsigned char me = 0; // все флаги/параметры отключены до старта
    me |= isHappy | isLaughing; // Я isHappy и isLaughing
    me &= ~isLaughing; // Я уже не isLaughing

    // Запрашиваем сразу несколько состояний (мы будем использовать static_cast для конвертации результатов в значения типа bool)
    std::cout

    Источник: https://ravesli.com/urok-46-bitovye-flagi-i-bitovye-maski/

    Битовая арифметика и операции над битами

    В Pascal над целыми типами (byte, shortint, word, integer, longint и их диапазоны) допустимы побитовые операции.

    Логические операции над битами

    Над битами двух целых операндов можно выполнять ранее рассмотренные логические операции: not, and, or, xor. Отличие между побитовыми и логическими операциями состоит в том, что побитовые (поразрядные) операции выполняются над отдельными битами операндов, а не над их значением в десятичном (обычно) представлении.

    Например, число 5 в двоичном представлении (в одном байте) имеет значение 00000101. Операция not инвертирует биты и мы получим 11111010, т.е число 250. Если побитовую операцию or использовать к числам 5 (00000101) и 3 (00000011), то получится число 7 (00000111).

    Операции циклического сдвига

    В Паскаль определены еще две операции над данными целого типа, имеющие тот же уровень приоритета, что и операции and, *, /, div и mod.

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

    При выполнении операции shr освободившиеся слева биты заполняются единицами при сдвиге вправо отрицательных значений и нулями в случае положительных значений.

    С помощью операции shl возможна замена операции умножения целых чисел на степени двойки. Следующие пары выражений приводят к одинаковому результату: (a shl 1) = a * 2, (a shl 2) = a * 4, (a shl3) = a * 8.

    Пример побитовых операций и циклического сдвига

    var A, B: byte;
    begin A := 11; {00001011} B := 6; {00000110} writeln('A=', A); writeln('B=', B); writeln('not A = ', not A); {11110100 = 244} writeln('A and B = ', A and B); {00000010 = 2} writeln('A or B = ', A or B); {00001111 = 15} writeln('A xor B = ', A xor B); {00001101 = 13} writeln('A shl 1 = ', A shl 1); {00010110 = 22} writeln('B shr 2 = ', B shr 2); {00000001 = 1}
    end.

    Практическое значение побитовых операций

    Операция and практически всегда используется только для достижения одной из двух целей: проверить наличие установленных в единицу битов или осуществить обнуление некоторых битов.

    Подобная проверка нужна, если число представляет набор признаков с двумя возможными значениями (набор флагов). Так, многие системные ячейки памяти содержат сведения о конфигурации компьютера или его состоянии. При этом установка бита с конкретным номером в 1 трактуется как включение какого-либо режима, а в 0 — выключение этого режима.

    Пусть переменная a имеет тип byte и является байтом с восемью флагами. Необходимо проверить состояние бита с номером 5 (биты нумеруются справа налево от 0 до 7). Единица в бите 5 — это пятая степень числа 2, т.е. 32 (00100000).

    Поэтому, если в пятом бите переменной a стоит единица, то выполняется условие (a and 32) = 32, которое можно проверить в операторе ветвления if. Если необходимо проверить состояние нескольких одновременно установленных в единицу битов, то нужно вычислить соответствующее число как сумму степеней числа 2, где показатели степени равны номерам битов, установленных в 1.

    Например, для битов 5, 2 и 0 имеем 32+4+1=37. Если a имеет среди прочих единицы в битах 5, 2, 0, то выполнится условие (a and 37) = 37.

    Пусть нужно обнулить какой-либо бит в переменной a типа byte (например, бит 3). Определим сначала число, содержащее единицы во всех битах, кроме третьего. Максимальное число, которое можно записать в тип byte, равняется 255.

    Чтобы в нем обнулить третий бит, вычтем из этого числа третью степень числа 2 (255-8=247). Если это число логически умножить на a, то его единицы никак не скажутся на состоянии переменной a, а нуль в третьем бите независимо от значения третьего бита переменной a даст в результате 0.

    Итак, имеем a:= a and (255-8). Аналогично можно обнулить несколько битов.

    Операция or применяется при установке в единицу отдельных битов двоичного представления целых чисел. Так, чтобы установить бит 4 переменной a в единицу без изменения остальных битов, следует записать a:= a or 16, где 16 — четвертая степень числа 2. Аналогично устанавливаются в единицу несколько битов.

    Операция xor применяется для смены значения бита (или нескольких битов) на противоположное (1 на 0 или 0 на 1). Так, чтобы переключить в противоположное состояние 3-й бит переменной a, следует записать a:= a xor 8, где 8 — третья степень числа 2.

    Источник: https://pas1.ru/bitarithmetic

    Ссылка на основную публикацию