Найти в Дзене
Информатика

Почему твой код может работать в 10 раз быстрее (и как хакеры взламывают пароли)

Знаешь, что общего у шифрования в Telegram, движка игры и алгоритмов сжатия видео? Все они работают на побитовых операциях — штуке, о которой в учебниках пишут так скучно, что хочется закрыть страницу. Но именно эти операции превращают твой код из медленной черепахи в ракету 🚀 Сейчас покажу, как работает магия на уровне процессора. Вот тебе неудобная правда: когда ты пишешь x * 2, процессор не умножает. Он вообще не знает, что такое умножение в человеческом понимании. Он работает только с битами — нулями и единицами. Представь число 5. Для тебя это просто пятёрка. Для процессора: 00000101 Восемь лампочек, пять из них выключены, три горят. Вот и всё. И когда ты просишь умножить на 2, процессор делает хитрую штуку — он просто сдвигает все биты влево: 00000101 → 00001010
(5) (10) Один сдвиг = умножение на 2. Два сдвига = на 4. Три = на 8. Почему это важно? Потому что x * 2 процессор считает за 10-15 тактов, а x << 1 (сдвиг влево) — за один такт. В десять раз быстре
Оглавление
Процессор не умеет считать (как ты)
Процессор не умеет считать (как ты)

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

Сейчас покажу, как работает магия на уровне процессора.

Твой процессор не умеет считать (как ты)

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

Представь число 5. Для тебя это просто пятёрка. Для процессора:

00000101

Восемь лампочек, пять из них выключены, три горят. Вот и всё. И когда ты просишь умножить на 2, процессор делает хитрую штуку — он просто сдвигает все биты влево:

00000101 → 00001010
(5) (10)

Один сдвиг = умножение на 2. Два сдвига = на 4. Три = на 8.

Почему это важно? Потому что x * 2 процессор считает за 10-15 тактов, а x << 1 (сдвиг влево) — за один такт. В десять раз быстрее. В играх, где каждый кадр — это миллионы вычислений, эта разница решает всё 🎮

Как устроена защита паролем в ZIP (спойлер: очень слабо)

Как устроена защита паролем в ZIP
Как устроена защита паролем в ZIP

Помнишь, как ставил пароль на архив и думал, что теперь файлы под замком? Ну... не совсем.

ZIP использует XOR-шифрование — одну из побитовых операций. Работает так:

  1. Берём твоё сообщение (допустим, букву H — в битах 01001000)
  2. Берём пароль как ключ (пусть 123 — в битах 01111011)
  3. Применяем XOR (исключающее ИЛИ):
01001000 (сообщение)
01111011 (ключ)
--------
00110011 (зашифровано)

Прикол в том, что если применить тот же ключ ещё раз — получишь исходное сообщение обратно:

00110011 (шифр)
01111011 (тот же ключ)
--------
01001000 (снова H!)

Магия? Нет, математика. XOR самообратимая операция — дважды применённая маска возвращает оригинал.

Вот только проблема: ZIP использует примитивный фиксированный ключ. Современный компьютер перебирает такие пароли за секунды. Поэтому для реальной защиты используют AES и другие серьёзные алгоритмы. Но принцип? Тот же самый — побитовые операции 🔐

Флаги: как программа запоминает 32 настройки в одной переменной

Флаги: как программа запоминает 32 настройки
Флаги: как программа запоминает 32 настройки

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

Плохой вариант: создать 32 отдельных переменных типа bool. Занимают кучу памяти.

Крутой вариант: использовать один int и хранить всё в его битах:

00101001
││││└─ бежит (1 = да)
│││└── прыгает (0 = нет)
││└─── стреляет (1 = да)
│└──── приседает (0 = нет)
└───── взял оружие (1 = да)

Как проверить, бежит ли персонаж?

if ((flags & 0b00000001) == 0b00000001) {
// Да, бежит!
}

Операция & (И) обнуляет все биты, кроме нужного. Если этот бит был включён — получишь маску обратно, если нет — ноль.

Как включить режим стрельбы?

flags |= 0b00000100; // Операция | (ИЛИ)

Как выключить?

flags &= ~0b00000100; // Сначала ~ инвертирует, потом & обнуляет бит

В реальных движках (Unity, Unreal) именно так работают теги, слои и маски коллизий. Один int — 32 настройки. Экономия памяти космическая 🌌

Почему мемы так быстро грузятся (алгоритмы сжатия)

Почему мемы так быстро грузятся
Почему мемы так быстро грузятся

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

Упрощённо: алгоритм JPEG анализирует изображение побитово, находит повторяющиеся паттерны и заменяет их короткими кодами. Вместо:

11111111 11111111 11111111 (три белых пикселя)

Хранит:

3 раза 11111111

А потом через битовые сдвиги и маски быстро распаковывает обратно. Без побитовых операций видео на YouTube грузилось бы часами 📹

Инверсия: как превратить 153 в 102 одним символом

Инверсия: как превратить 153 в 102
Инверсия: как превратить 153 в 102

Есть операция ~ (НЕ) — она переворачивает все биты:

unsigned char x = 153; // 10011001
unsigned char y = ~x; // 01100110 = 102

Зачем это нужно? Например, для создания негатива изображения. Каждый цвет пикселя — это число. Примени ~ — и фотография превратится в негатив. Один символ в коде — и ты написал инстаграм-фильтр ~~(если бы инста не была заблокирована)~~ 📸

Или вот: x + ~x для 8-битного числа всегда даёт 255 — число, где все биты включены. Это используют для проверки целостности данных.

Что дальше?

Побитовые операции — это не просто трюки для олимпиад. Это фундамент:

  • Графика: цвета в формате RGB — это биты, упакованные в int
  • Сети: IP-адреса, маски подсетей — всё на битах
  • Криптография: любое шифрование начинается с битовых операций
  • Оптимизация: иногда правильный сдвиг заменяет целую формулу

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

🔥 Хочешь копнуть глубже?

Полный учебный материал с детальными примерами, таблицами истинности и готовыми программами ждёт тебя на нашем сайте!

Сохрани в закладки — это база, которая работает в любом языке программирования. От C до Python, от Java до Rust. Биты везде одинаковые 🚀