Что такое побитовые операции в python
Операторы Python
В этом руководстве речь пойдет об операторах языка программирования Python. Вы узнаете об арифметических, логических и битовых операторах, а также операторах сравнения, присваивания, принадлежности, тождественности и их синтаксисе. Все это будет проиллюстрировано примерами.
Оператор в Python — это символ, который выполняет операцию над одним или несколькими операндами.
Операндом выступает переменная или значение, над которыми проводится операция.
Введение в операторы Python
Операторы Python бывают 7 типов:
Арифметические операторы Python
Этот тип включает операторы для проведения базовых арифметических операций.
Сложение (+)
Складывает значение по обе стороны оператора.
Пример:
Вычитание (-)
Вычитает значение правой стороны из значения в левой.
Пример:
Умножение (*)
Перемножает значения с обеих сторон оператора.
Пример:
Деление (/)
Делит значение левой стороны на значение правой. Тип данных результата деления — число с плавающей точкой.
Пример:
Возведение в степень (**)
Возводит первое число в степень второго.
Пример:
Деление без остатка (//)
Выполняет деление и возвращает целочисленное значение частного, убирая цифры после десятичной точки.
Пример:
Деление по модулю (остаток от деления) (%)
Выполняет деление и возвращает значение остатка.
Пример:
Операторы сравнения
Операторы сравнения в Python проводят сравнение операндов. Они сообщают, является ли один из них больше второго, меньше, равным или и то и то.
Меньше (
Этот оператор проверяет, является ли значение слева меньше, чем правое.
Пример:
Больше (>)
Проверяет, является ли значение слева больше правого.
Пример:
Меньше или равно (
Проверяет, является ли левая часть меньше или равной правой.
Пример:
Больше или равно (>=)
Проверяет, является ли левая часть больше или равной правой.
Пример:
Равно (==)
Не равно (!=)
Проверяет, не равно ли значение слева правому. Оператор <> выполняет ту же задачу, но его убрали в Python 3.
Операторы присваивания
Оператор присваивания присваивает значение переменной. Он может манипулировать значением до присваивания. Есть 8 операторов присваивания: 1 простой и 7 с использованием арифметических операторов.
Присваивание (=)
Присваивает значение справа левой части. Стоит обратить внимание, что == используется для сравнения, а = — для присваивания.
Пример:
Сложение и присваивание (+=)
То же касается и все остальных операторов присваивания.
Пример:
Вычитание и присваивание (-=)
Вычитает значение справа из левого и присваивает его выражению слева.
Пример:
Деление и присваивание (/=)
Делит значение слева на правое. Затем присваивает его выражению слева.
Пример:
Умножение и присваивание (*=)
Перемножает значения обеих сторон. Затем присваивает правое левому.
Пример:
Деление по модулю и присваивание (%=)
Выполняет деление по модулю для обеих частей. Результат присваивает левой части.
Пример:
Возведение в степень и присваивание (**=)
Выполняет возведение левой части в степень значения правой части. Затем присваивает значение левой части.
Пример:
Деление с остатком и присваивание (//=)
Выполняет деление с остатком и присваивает результат левой части.
Пример:
Это один из важных операторов Python
Логические операторы Python
Это союзы, которые позволяют объединять по несколько условий. В Python есть всего три оператора: and (и), or (или) и not (не).
И (and)
Если условия с двух сторон оператора and истинны, тогда все выражение целиком считается истинным.
Пример:
Или (or)
Выражение ложно, если оба операнда с двух сторон ложные. Если хотя бы одно из них истинное, то и все выражение истинно.
Пример:
Не (not)
Операторы принадлежности
Нет в (not in)
Этот оператор проверяет, НЕ является ли значение членом последовательности.
Пример:
Операторы тождественности
Эти операторы проверяют, являются ли операнды одинаковыми (занимают ли они одну и ту же позицию в памяти).
Это (is)
Это не (is not)
Битовые операторы Python
Эти операторы работают над операндами бит за битом.
Бинарное И (&)
Бинарное ИЛИ (|)
Проводит побитовую операцию or на двух значениях. Здесь or для 10 (2) и 11 (3) возвращает 11 (3).
Пример:
Бинарное ИЛИ НЕТ (^)
Проводит побитовую операцию xor (исключающее или) на двух значениях. Здесь результатом ИЛИ НЕ для 10 (2) и 11 (3) будет 01 (1).
Пример:
Инвертирующий оператор (
Бинарный сдвиг влево (
Бинарный сдвиг вправо (>>)
Выводы
В этом уроке были рассмотрены все 7 типов операторов Python. Для каждого был предложен пример в IDE. Для понимания особенностей работы операторов нужно продолжать с ними работать, использовать в условных конструкциях и объединять.
BestProg
Битовые операторы
Связанные темы
Поиск на других ресурсах:
1. Назначение битовых операторов. Перечень
Язык Python поддерживает работу с двоичными разрядами (битами) целочисленных величин, где каждый бит числа рассматривается в отдельности. Для обеспечения этого в Python используются так называемые битовые или поразрядные операторы, которые реализуют общеизвестные битовые операции. Поддержка битовых операторов есть также в других языках программирования.
В битовых операторах (операциях) каждый операнд рассматривается как последовательность двоичных разрядов (бит), которые принимают значение 0 или 1 (двоичная система исчисления). Над этими разрядами можно выполнять известные операции (логическое «И», логическое «ИЛИ» и т.д.)
Перечень битовых операторов языка Python в порядке убывания приоритета следующий:
2. Битовый оператор
В битовом операторе (операции)
Пример.
Операторы сдвига влево и сдвига вправо >> сдвигают каждый бит на одну или несколько позиций влево или вправо. Общая форма операторов следующая
Рисунок 1. Работа операций: а) сдвига влево (умножение на 2); b) сдвига вправо >> (целочисленное деление на 2)
Если нужно помножить число на 16, то нужно сдвинуть это число на 4 бита влево. Если нужно разделить число на 8, то нужно сдвинуть это число на 3 бита вправо. Скорость выполнения операций сдвига выше в сравнении с операциями умножения и деления на числа кратные 2 в степени N ( N – количество сдвинутых бит).
Пример.
Результат работы программы
4. Битовый оператор & (И, AND). Пример
Каждый целочисленный операнд рассматривается как набор бит, над любым из которых выполняется побитовая операция «И».
На рисунке 2 показана работа битовой операции «И».
Рисунок 2. Битовый оператор & «И»
Как видно из рисунка, бит в позиции 0 первого операнда ( x ) вычисляется с битом в позиции 0 второго операнда ( y ), соответственно бит в позиции 1 первого операнда ( x ) вычисляется с битом в позиции 1 второго операнда ( y ) и т.д. При таких вычислениях результирующее значение любого бита определяется по следующим формулам:
Пример.
Результат работы программы
5. Битовый оператор ^ (исключающее ИЛИ, XOR). Пример
Битовый оператор исключительное ИЛИ обозначается символом ^ и выполняет операцию сложения по модулю 2 для любого бита операндов. Общая форма оператора следующая
Оператор исключающего ИЛИ (XOR) оперирует двоичными разрядами. Каждый операнд рассматривается как последовательность бит. Результат побитового исключающего ИЛИ определяется по следующим формулам
На рисунке 3 отображен пример битового исключающего ИЛИ для двух операндов.
Рисунок 3. Битовый оператор «исключающее ИЛИ»
Пример.
Результат работы программы
6. Битовый оператор | ИЛИ (OR). Пример
Общая форма битового оператора | следующая
На рисунке 4 продемонстрирована работа битового оператора ИЛИ на примере двух произвольных операндов
Рисунок 4. Битовый оператор ИЛИ
Пример.
Результат работы программы
7. Примеры использования битовых операторов
Пример 1. Вытянуть из числа 4,5,6 биты и определить их целочисленное значение.
Результат работы программы
Пример 2. Умножить значения двух чисел. В первом числе взять биты, которые размещенные в позициях 0-5. Во втором числе взять биты, которые размещены в позициях 0-7.
Что такое побитовые операции в python
Что такое бинарные (или битовые) операции и как из можно использовать в Python?
В фреймворке PyQt (и PySide тоже) часто встречается настройка чего-либо с помощью так называемых флагов.
Взаимодействие нескольких флагов делается с помощью бинарных (или побитовых) операторов.
Несколько флагов можно указать с помощью оператора «|»
исключить флаг из уже имеющегося набора можно так
Добавить новый флаг к имеющимся можно так
А проверка наличия делается так
Почему именно так? Всё дело в том как именно работают побитовые операторы. Всего есть 6 основных операторов:
Эти операторы работают с числами в двоичном представлении. Условно говоря, они ставят числа в двоичном виде друг над другом и по очереди обрабатывают каждый столбик с битами.
Например, берём два числа, и сразу смотрим как оно выглядит в двоичном виде (Python отбрасывает ведущие нули, так что рядом допишу более удобную форму)
Оператор OR
В результат пишет 1 если в одном из элементов есть 1
в двоичном виде это выглядит так (запишем столбиком)
В каждом столбце был найден 1, поэтому в результате все биты равны 1
Оператор AND
В результат ставит 1 только если оба бита равны 1
Только на 2й позиции оба бита равны 1.
Оператор XOR
Пишет 1 на бит результата, для которого только один из соответствующих битов операндов равен 1.
Оператор NOT
Заменяет каждый бит на противоположный. Эта операция унарная, то есть поддерживает только один операнд.
Здесь всё понятно. Но давайте попробуем другое число:
Сдвиг
Здесь всё просто. Все биты сдвигаются на указанное количество шагов подставляя нули
Кстати, преобразовать бинарное представление обратно в число можно с помощью функции int() указав разрядность системы исчисления.
Лично я на практике встречал использование побитовых операторов в двух ситуациях (их конечно намного больше).
1. Сдвиг, который соответствует некоторой математической операции (арифметический сдвиг) но работает несравнимо быстрей. Например сдвиг влево равен выражению a*2**b
А также определение знака числа или нахождение модуля без условного оператора, что также очень быстро делается. И другие операции.
Создаем несколько переменных, в которых в бинарном представлении все ячейки заполнены нулями кроме одной позиции. И у каждой переменной используется своя уникальная позиция для бита 1.
Теперь с помощью оператора OR можем объединять все биты в одну маску
А после проверить, входит ли определённый флаг в состав битов маски?
Если результат больше 0 то флаг присутствует в маске. Если результат 0 то такого флага нет.
Чтобы получить тип bool можем писать так
Где могут пригодиться такие маски? Один пример был про флаги в Qt фреймворке. Также такой способ часто используют в организации прав доступа к ресурсам.
Не сложно представить альтернативу на простом Python
Оператор in работает довольно шустро, но всё равно медленней чем побитовый оператор.
Основные операторы Python
Операторы используются для выполнения определенных операций с переменными и значениями. В Python есть много операторов, которые являются ключевыми словами или специальными символами. Значения или переменные, с которыми работают эти операторы, называются операндами.
Типы операторов Python
Операторы Python можно разделить на следующие категории.
1. Арифметические операторы
Арифметические операторы обычно работают с числами. Есть операторы для сложения, вычитания, умножения, деления, модуля и экспоненциальных операций. Некоторые из этих операторов работают и со строками. Все арифметические операторы — специальные символы.
Давайте посмотрим на пример арифметических операторов в Python.
Python поддерживает операторы сложения и умножения для строк.
2. Сравнения
Список операторов сравнения:
4. Логические
5. Операторы присваивания
Оператор присваивания (=) используется для присвоения значения левого операнда правому операнду.
Есть несколько составных операторов присваивания, которые выполняют арифметические операции между двумя операндами и затем присваивают значение левому операнду.
6. Операторы членства
Операторы членства используются для проверки наличия значения в последовательности. В Python есть два оператора членства.
Эти операторы обычно используются с условием if-else.
7. Идентификации
Операторы идентификации используются для проверки, указывают ли две переменные на одно и то же место в памяти или нет. Есть два оператора идентичности.
Приоритет
Иногда выражение содержит несколько операторов. В этом случае приоритет оператора используется для определения порядка выполнения.
В таблице ниже перечислены приоритеты операторов в порядке убывания.
Приоритет |
---|
** (экспонента) |