Добро пожаловать обратно на подготовку к собеседованию. Сегодня мы рассмотрим новую тему, которая поможет вам подготовиться к этому большому техническому собеседованию: побитовые манипуляции.
Сначала изюминка, чтобы вас мотивировать: что это такое и почему мне нужно это знать?
При побитовой манипуляции мы рассматриваем числа не с точки зрения базы 10, а с точки зрения базы 2. Например, число “10” в базе-10 будет выражено как “1010” в базе-2.
Почему это так важно?
На данный момент, я боюсь, вам придется принять это на веру, что, исследуя числа таким побитовым способом с базой 2, мы можем производить тонкие манипуляции с этими числами, что делает решение определенных алгоритмов действительно легким. Если бы мы попытались использовать базу-10 для этих определенных алгоритмов, это был бы кровавый беспорядок!
Находимся ли мы на борту re: база 2 и что такое бит?
Вы можете пропустить этот раздел, если вы уже знаете о базе 2 и битах, в противном случае читайте дальше.
Возьмите обычное число с базой 10, например 156. Вы знаете из начальной школы, покажите, как читать это число, так как вы узнали о значении места .
Позвольте мне внести небольшие изменения в изображение выше. Давайте используем более похожее на информатику выражение для значений 3 столбцов. Вместо “100s” мы будем называть это “10 в степени 2” или 10 ^ 2. Вместо “10s” это 10 в степени 1: 10 ^ 1. Наконец, столбец “1s” равен 10 в степени 0: 10 ^ 0 ((Запомните любое число в степени 0а, мощность которого вычисляется до “1”
Держу пари, ты понял. Итак, вот быстрая проверка. Можете ли вы выяснить, что “10101” в базе-2 получается в базе-10?
Правильно! Сейчас 21 год. Начиная с правой части номера, мы имеем 1*2^4 + 0* 2^3 + 1* 2^2 + 0* 2^1 + 1 *
Давайте Изучим Некоторую Терминологию
Теперь, когда мы знаем, что такое база 2, мы можем начать использовать более сложные термины информатики.
Давайте просто посмотрим на второе базовое число: 11100
Представьте, что каждое число, 1 или 0, занимает отдельную ячейку в электронной таблице. На иллюстрации ниже я дал каждой колонке букву, чтобы идентифицировать ее:
Модное слово для каждой ячейки электронной таблицы: байт
В каждой ячейке или байте единственные два числа, которые мы можем поместить в них, – это 1 или 0.
Если мы помещаем 1 в ячейку, то эта ячейка или байт считаются установленными или на .
Напротив, если в байте хранится 0 , этот байт считается чистым или выключен .
Это означает, что в нашем примере выше мы видим, что столбцы A, B и C содержат байты, которые “установлены” или “включены”, в то время как столбцы D и E содержат байты, которые “очищены” или “выключены”. *
Забавно в стороне: байты представляются нам, людям, как целое число 1 или целое число 0. Однако компьютер не “видит” эти символы. Просто распознает интенсивность света. Это означает, что байт, содержащий “1”, воспринимается компьютером как более яркий свет. “0” воспринимается компьютером как более тусклый свет.
Давайте Начнем Манипулировать Этими Битами!
Итак, наконец-то мы знаем достаточно, чтобы начать делать небольшие волны!
Давайте изучим некоторые основные операции с битами:
Побитовое НЕ ( ~ )
Побитовое И ( & )
Побитовый ИЛИ ( | )
Побитовое XOR ( ^ )
Давайте рассмотрим их по одному за раз:
Побитовый НЕ
Побитовое НЕ ( ~ ) – это просто. Если бит установлен (1), то побитовый НЕТ, знак тильды ( ~ ) очищает его (превращает в 0).
Если бит чист (0), знак тильды ( ~ ) очистит его.
Итак, дано второе базовое число 11100. Если мы применим побитовое НЕТ, мы получим 00011:
~(11100)
Побитовый И
Не путайте обычный символ И, который вы уже знаете (&&), с ПОБИТОВЫМ И (&). Побитовый И представлен только одним амперсандом на языке Java. Мы используем это побитово И когда работаем только на уровне битов.
Подумайте о побитовом И подобном умножении. Когда мы берем два числа с двумя основаниями ОДИНАКОВОЙ ДЛИНЫ и применяем побитовое, мы найдем результат, умножив столбец одного числа на соответствующий столбец второго числа:
Начиная с столбца A. Умножьте 1 в столбце 3 на 1 прямо под ним в ячейке A5, и в результате мы получим 1 в ячейке A7.
Столбец B: 1 x 0 дает нам ноль Столбец C: 1 x 1 дает нам 1 Столбец D: 0 x 1 дает нам ноль Столбец E: 0 x 0 дает нам ноль
Побитовый ИЛИ ( | )
Опять же, обратите внимание, что побитовое ИЛИ представлено только ОДНИМ символом канала. Это отличается от обычного ИЛИ ( ||) с двумя символами канала, которые вы привыкли использовать в языке Java.
Вы можете думать о побитовом ИЛИ подобном сложении. Вы будете добавлять каждый столбец по отдельности:
На этот раз в колонке А мы складываем 1 и 1 и получаем технически 10 в базе два, но мы отрежем ноль и назовем его единицей.
В графе B: 0 + 1 дает нам 1
В Кол-ве C: 1 + 1 дает нам 1
В графе D: 1 + 1 дает нам 1
В Коуле 0 + 0 дает нам 0
А теперь идет мой любимый:
Побитовое XOR ( ^ )
XOR произносится как ЭКС-ИЛИ, а также как ИЛИ (как у Зоро, знаменитого фехтовальщика!) Для этого все, что вам нужно помнить, это то, что в каждом столбце, если одно число содержит “1”, другое число должно содержать “0”, чтобы в результате получилось “1”. Если оба байта установлены, или если оба байта очищены, то мы получим “0”.
Давайте посмотрим на это в действии:
В столбце A, 1 и 1 возвращают 0
Столбец B: 1 и 0 возвращают 1
Col C: 1 и 1 возвращают 0
Столбец D: 1 и 0 возвращают 1
Столбец E: 0 и 0 возвращают 0
Теперь, когда вы знаете некоторые основные битовые манипуляции, мы можем приступить к решению некоторых алгоритмов битовой манипуляции, в которых вступает в игру красота битов. Мы сможем “точно настроить” и провести тонкие различия между целыми числами, используя базу 2 и битовые манипуляции, в отличие от использования базы 10, чтобы попытаться выполнить то же самое. Подумайте о разнице в вашем коде так же, как о разнице между педалями розы (база 2) и массой (база 10)!
Увидимся в следующий раз за большим!
А тем временем:
Продолжайте воплощать свои мечты!
Намасте!
Оригинал: “https://dev.to/kuddleman/interview-prep-bitwise-manipulation-1o1”