Побитовая операция — Bitwise operation

Побитовая операция — Bitwise operation

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

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

Содержание

  • 1 Побитовые операторы
    • 1.1 НЕ
    • 1.2 И
    • 1.3 ИЛИ
    • 1.4 XOR
    • 1.5 Математические эквиваленты
    • 1.6 Таблица истинности для всех бинарных логических операторов
  • 2 битовых сдвига
    • 2.1 Битовая адресация
    • 2.2 Арифметический сдвиг
    • 2.3 Логический сдвиг
    • 2.4 Круговой сдвиг
      • 2.4.1 Повернуть
      • 2.4.2 Поворот через перенос
    • 2.5 На языках высокого уровня
      • 2.5.1 C-семейство
        • 2.5.1.1 Круговые смещения
      • 2.5.2 Java
      • 2.5.3 JavaScript
      • 2.5.4 Паскаль
  • 3 Другое
  • 4 Приложения
  • 5 Булева алгебра
    • 5.1 И
    • 5.2 ИЛИ
    • 5.3 НЕ
    • 5.4 XOR
    • 5.5 Другое
    • 5.6 Обращения и решение уравнений
    • 5.7 Порядок действий
  • 6 См. Также
  • 7 ссылки
  • 8 Внешние ссылки

Побитовые операторы

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

Побитовое НЕ , или дополнение , является унарной операцией , которая выполняет логическое отрицание на каждый бит, формируя обратный код данного двоичного значения. Биты, равные 0, становятся 1, а те, которые равны 1, становятся 0. Например:

Поразрядное дополнение равно двум дополнительным значениям минус один. Если используется арифметика с дополнением до двух, то NOT x = -x − 1 .

Для беззнаковых целых чисел побитовое дополнение числа является «зеркальным отражением» числа в средней точке диапазона беззнаковых целых чисел. Например, для 8-битных целых чисел без знака NOT x = 255 — x , которые можно визуализировать на графике в виде нисходящей линии, которая эффективно «переворачивает» увеличивающийся диапазон от 0 до 255 в убывающий диапазон от 255 до 0. Простой, но наглядный пример использования заключается в инвертировании изображения в градациях серого, где каждый пиксель хранится как целое число без знака.

Побитовое И это бинарная операция , которая принимает два равной длины двоичных представлений и выполняет логическую операцию над каждой парой соответствующих битов, что эквивалентно умножению их. Таким образом, если оба бита в сравниваемой позиции равны 1, бит в результирующем двоичном представлении равен 1 (1 × 1 = 1); в противном случае результат равен 0 (1 × 0 = 0 и 0 × 0 = 0). Например:

Операция может быть использована для определения , является ли конкретный бит установлен (1) или ясно (0). Например, учитывая битовый шаблон 0011 (десятичное число 3), чтобы определить, установлен ли второй бит, мы используем побитовое И с битовым шаблоном, содержащим 1 только во втором бите:

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

Поразрядное И может использоваться для очистки выбранных битов (или флагов ) регистра, в котором каждый бит представляет отдельное логическое состояние. Этот метод является эффективным способом хранения ряда логических значений с использованием как можно меньшего объема памяти.

Например, 0110 (десятичное число 6) можно рассматривать как набор из четырех флагов, где первый и четвертый флаги сняты (0), а второй и третий флаги установлены (1). Третий флаг может быть сброшен с помощью побитового И с шаблоном, который имеет ноль только в третьем бите:

Благодаря этому свойству становится легко проверить четность двоичного числа, проверив значение самого младшего бита. Используя приведенный выше пример:

Поскольку 6 И 1 равно нулю, 6 делится на два и, следовательно, четно.

ИЛИ ЖЕ

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

Поразрядное ИЛИ может использоваться для установки в 1 выбранных битов регистра, описанного выше. Например, четвертый бит 0010 (десятичное 2) может быть установлен путем выполнения побитового ИЛИ с шаблоном только с установленным четвертым битом:

Побитовое исключающее ИЛИ является бинарная операция , которая принимает два битовых комбинаций равной длины и выполняет логическое исключающее ИЛИ операции на каждой паре соответствующих битов. Результатом в каждой позиции будет 1, если только один из битов равен 1, но будет 0, если оба равны 0 или оба равны 1. В этом случае мы выполняем сравнение двух битов, равное 1, если два бита различны, и 0 если они такие же. Например:

Поразрядное исключающее ИЛИ можно использовать для инвертирования выбранных битов в регистре (также называемого переключением или переключением). Любой бит может быть переключен с помощью XOR с 1. Например, учитывая битовый шаблон 0010 (десятичное 2), второй и четвертый биты могут переключаться с помощью побитового XOR с битовым шаблоном, содержащим 1 во второй и четвертой позициях:

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

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

Если набор битовых строк фиксированной длины n (т. Е. Машинных слов ) рассматривается как n -мерное векторное пространство над полем , то сложение векторов соответствует побитовой операции XOR. F 2 п < displaystyle < bf > _ <2>^ > F 2 < displaystyle < bf > _ <2>>

Математические эквиваленты

Предполагая , что для неотрицательных целых чисел побитовые операции могут быть записаны следующим образом: Икс ≥ y < displaystyle x geq y>

НЕ ⁡ Икс знак равно ∑ п знак равно 0 ⌊ журнал 2 ⁡ ( Икс ) ⌋ 2 п [ ( ⌊ Икс 2 п ⌋ мод 2 + 1 ) мод 2 ] знак равно 2 ⌊ журнал 2 ⁡ ( Икс ) ⌋ + 1 — 1 — Икс Икс И ⁡ y знак равно ∑ п знак равно 0 ⌊ журнал 2 ⁡ ( Икс ) ⌋ 2 п ( ⌊ Икс 2 п ⌋ мод 2 ) ( ⌊ y 2 п ⌋ мод 2 ) Икс ИЛИ ЖЕ ⁡ y знак равно ∑ п знак равно 0 ⌊ журнал 2 ⁡ ( Икс ) ⌋ 2 п ( [ ( ⌊ Икс 2 п ⌋ мод 2 ) + ( ⌊ y 2 п ⌋ мод 2 ) + ( ⌊ Икс 2 п ⌋ мод 2 ) ( ⌊ y 2 п ⌋ мод 2 ) ] мод 2 ) Икс XOR ⁡ y знак равно ∑ п знак равно 0 ⌊ журнал 2 ⁡ ( Икс ) ⌋ 2 п ( [ ( ⌊ Икс 2 п ⌋ мод 2 ) + ( ⌊ y 2 п ⌋ мод 2 ) ] мод 2 ) знак равно ∑ п знак равно 0 ⌊ журнал 2 ⁡ ( Икс ) ⌋ 2 п [ ( ⌊ Икс 2 п ⌋ + ⌊ y 2 п ⌋ ) мод 2 ] < displaystyle < begin operatorname x & = sum _ ^ < lfloor log _ <2>(x) rfloor> 2 ^ left [ left ( left lfloor < frac <2 ^ >> right rfloor < bmod <2>> + 1 right) < bmod <2>> right] = 2 ^ < left lfloor log _ <2>(x) right rfloor +1> -1-x \ x operatorname y & = sum _ ^ < lfloor log _ <2 >(x) rfloor> 2 ^ left ( left lfloor < frac <2 ^ >> right rfloor < bmod <2>> right) left ( left lfloor < frac <2 ^ >> right rfloor < bmod <2>> right) \ x operatorname y & = sum _ ^ < lfloor log _ <2>(x) rfloor> 2 ^ left ( left [ left ( left lfloor < frac <2 ^ >> right rfloor < bmod <2>> right) + left ( left lfloor < frac <2 ^ >> right rfloor < bmod <2>> right) + left ( left lfloor < frac <2 ^ >> right rfloor < bmod <2>> right) left ( left lfloor < frac <2 ^ >> right rfloor < bmod <2>> right) right] < bmod <2>> right) \ x operatorname y & = sum _ ^ < lfloor log _ <2>(x) rfloor> 2 ^ left ( left [ left ( left lfloor < frac <2 ^ >> right rfloor < bmod <2>> right) + left ( left lfloor < frac <2 ^ >> right rfloor < bmod <2>> right) right] < bmod <2>> right) = sum _ ^ < lfloor log _ <2>(x) rfloor> 2 ^ left [ left ( left lfloor < frac <2 ^ >) > right rfloor + left lfloor < frac <2 ^ >> right rfloor right) < bmod <2>> right] end <выравнивается>>>

Таблица истинности для всех бинарных логических операторов

Вот побитовые эквивалентные операции двух битов P и Q:

п q F 0 NOR 1 Xq 2 ¬p 3 ↛ 4 ¬q 5 XOR 6 NAND 7 И 8 XNOR 9 q 10 Если / то 11 р 12 Тогда / если 13 ИЛИ 14 Т 15
110000000011111111
100000111100001111
010011001100110011
000101010101010101
Побитовые
эквиваленты
0 НЕ
(p ИЛИ q)
(НЕ p)
И q
НЕ
п
p И
(НЕ q)
НЕ
q
p XOR q НЕ
(p И q)
p И q НЕ
(p XOR q)
q (НЕ p)
ИЛИ q
п p ИЛИ
(НЕ q)
p ИЛИ q 1

Битовые сдвиги

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

Битовая адресация

Если ширина регистра (часто 32 или даже 64) больше, чем количество битов (обычно 8) наименьшего адресуемого блока (атомарного элемента), часто называемого байтом, операции сдвига вызывают схему адресации битов. Не обращая внимания на граничные эффекты на обоих концах регистра, операции арифметического и логического сдвига ведут себя одинаково, а сдвиг на 8-битные позиции переносит битовый шаблон на 1-байтовую позицию следующим образом:

Побитовые операции. Программирование на C и C++

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

Основа вычислений

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

Хотя одна бинарная цифра может использоваться для представления True (1) (истина) или False (0) (ложь) в логике, для хранения больших чисел и выполнения сложных функций можно использовать несколько двоичных цифр. Фактически любое число может быть представлено в двоичном формате.

Применение

Побитовые операторы используются в следующих областях:

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

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

Низкоуровневое программирование для таких приложений, как драйверы устройств, криптографическое программное обеспечение, ПО для декодирования видео, распределители памяти, программное обеспечение для сжатия и графики.

Удобное ведение больших наборов целых чисел в задачах поиска и оптимизации.

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

Побитовые операции — как это работает?

В отличие от обычных логических операторов (например, +, -, *), которые работают с байтами или группами байтов, побитовые операторы могут проверять или устанавливать каждый из отдельных битов в байте. Побитовые операции никогда не вызывают переполнения в ячейках памяти, потому что результат, полученный после выполнения операции, находится в пределах диапазона возможных значений для числового типа.

Побитовые операторы, используемые в семействе языков C (C #, C и C ++):

OR (|) — результат является истиной, если любой из операндов истинен.

AND (&) — результат верен, только если оба операнда верны. Его можно использовать для настройки маски проверки значений определенных битов.

XOR (^) — результат является истиной, только если один из его операндов истинен. Он используется, в основном, для переключения определенных бит. Он также помогает заменять две переменные без использования третьей.

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

>> (Right-Shift) и >) и правый сдвиг нулевой заливки (>>>>) иногда упоминаются как побитовые операторы и называются операторами сдвига бит.

Приоритезация

Порядок приоритетности (от наивысшего до самого низкого) в побитовых операторах при программировании на C:

Right-Shift и Left-Shift);

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

Бит и программирование на C и других языках

Бит является наименьшей единицей измерения, используемой для количественной оценки компьютерных данных. Он содержит одно двоичное значение — 0 или 1.
Хотя один бит может определять логическое значение True (1) или False (0), как отдельная единица он используется редко. Поэтому в компьютерном хранилище биты часто группируются в 8-битные кластеры, называемые байтами. Поскольку байт содержит восемь бит, каждый из которых имеет два возможных значения, в побитовых операциях в Си (язык программирования) один байт может иметь 28 или 256 различных значений.

Как правило, файлы, устройства хранения и емкость хранилища измеряются в байтах, а скорости передачи данных измеряются в битах. Например, карта памяти SSD может иметь емкость 240 ГБ, тогда как загрузка может переноситься со скоростью 10 Мбит/с. Кроме того, биты также используются для описания архитектуры процессора, такой как 32-разрядный или 64-разрядный процессор.

Побитовые операции в паскале

Побитовый уровень операций в паскале включает в себя работу с отдельными битами, которые являются наименьшими единицами данных на компьютере. Хотя компьютеры способны манипулировать битами, они обычно хранят данные и выполняют инструкции в битовых кратных значениях, называемых байтами. Большинство языков программирования, в том числе побитовые операции в Delphi, управляют группами из 8, 16 или 32 бит.

Описание процесса

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

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

связь по портам/сокетам;

программирование встроенных систем;

машины с конечным состоянием.

Побитовый оператор работает с двоичным представлением числа, а не с его значением. Операнд рассматривается как набор бит, а не как один номер. Побитовые операторы аналогичны в большинстве поддерживающих их языков — C, Java, JavaScript, Python и Visual Basic.

Почему это важно использовать?

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

http://gaz.wiki/wiki/ru/Bitwise_operation
http://fb.ru/article/368075/pobitovyie-operatsii-programmirovanie-na-c-i-c

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

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