Найти в Дзене

Поразрядные операции с числами в Python, продолжаем учиться

Народ, всем привет. Сегодня мы поговорим про поразрядные (они же битовые) операции, которые выполняются не над числами целиком, а над их двоичным представлением, бит за битом. В Python они широко используются в системном программировании, работе с флагами, оптимизации, криптографии, сетевых протоколах и при решении алгоритмических задач. Любое целое число в компьютере хранится в двоичной системе счисления. При двоичной системе каждый разряд числа может иметь только два значения - 0 и 1. Например, 0 в десятичной системе также будет равен 0 в двоичной системе, а 1 в десятичной системе будет соответствовать 1 в двоичной системе. Следующее число в десятичной системе - 2 в двоичной системе будет соответствовать 10. То есть, когда мы к 1 прибавляем 1, то результатом будет 10. И так далее. Например, 5 в двоичном представлении 101 и имеет три разряда. 5 → 0b101 10 → 0b1010 В Python для отображения числа в двоичном виде используется функция bin(): bin(10) # '0b1010' Для вывода десятичного числа
Оглавление

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

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

5 → 0b101
10 → 0b1010
-2

В Python для отображения числа в двоичном виде используется функция bin():

bin(10) # '0b1010'

Для вывода десятичного числа в двоичной системе можно применять спецификатор 0b:

number = 5 # в двоичной форме 101
print(f"number = {number:0b}") # number = 101

Без указания спецификатора функция print() выводит число в десятичной системе. При этом Python позволяет сразу определять число в двоичной форме. Для этого число в двоичной форме указывается после префикса 0b:

number = 0b101 # определяем число в двоичной форме
print(f"number = {number:0b}") # number = 101
print(f"number = {number}") # number = 5 - в десятичной системе
-3

Основные поразрядные операторы

Python поддерживает стандартный набор битовых операторов:

  • & - AND (И), то есть 1, если оба бита равны 1
  • ` ` - OR (ИЛИ)
  • ^ - XOR (исключающее ИЛИ), то есть 1, если биты различны
  • ~ - NOT (НЕ), инверсия всех битов
  • << - сдвиг битов влево
  • >> - сдвиг битов вправо

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

a = 5 # 0b101
b = 3 # 0b011
print(a & b) # 1

Побитово:

101
& 011
-----
001
Результат — 1.
-4

Канал «Т.Е.Х.Н.О Windows & Linux» — экспертные статьи, реальные гайды, настройка ПК, приватность и оптимизация. Всё бесплатно и без платных подписок!

Т.Е.Х.Н.О Windows & Linux | Дзен

Присоединяйся, чтобы стать профи!

Поразрядное ИЛИ (|), устанавливает бит в 1, если хотя бы один из битов равен 1. Часто применяется для установки флагов.

a = 5 # 0b101
b = 3 # 0b011
print(a | b) # 7
101
| 011
-----
111
Результат — 7.

Исключающее ИЛИ (^) возвращает 1, если биты различны. Полезен для шифрования, поиска уникального элемента или обмена значениями без временной переменной.

a = 5 # 101
b = 3 # 011
print(a ^ b) # 6
101
^ 011
-----
110
Результат — 6.
-5

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

a = 5
print(~a) # -6

Формула:

~x = -x - 1

Сдвиг влево (<<), сдвигает биты влево, добавляя нули справа. Эквивалентен умножению на 2^n.

a = 3 # 0b11
print(a << 2) # 12
11 << 2 → 1100
3 << 2 = 12

Сдвиг вправо (>>), сдвигает биты вправо. Для положительных чисел эквивалентен целочисленному делению на 2^n.

a = 12 # 1100
print(a >> 2) # 3
1100 >> 2 → 11
-6

Работа с битами и флагами

Частый сценарий это хранение нескольких логических значений в одном числе.

READ = 0b001
WRITE = 0b010
EXECUTE = 0b100
permissions = READ | WRITE

Проверка флага:

if permissions & READ:
print("Чтение разрешено")

Добавление флага:

permissions |= EXECUTE

Удаление флага:

permissions &= ~WRITE

Проверка, установлен ли бит, это проверка n-го бита:

def is_bit_set(x, n):
return (x & (1 << n)) != 0

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

-7

Хотите знать больше? Читайте нас в нашем Telegram – там еще больше интересного: новинки гаджетов, технологии, AI, фишки программистов, примеры дизайна и маркетинга.