Добро пожаловать обратно к дальнейшей работе над манипуляциями с битами в рамках подготовки к тому важному собеседованию, на которое вы собираетесь.
Мы будем продвигаться вперед, основываясь на том, о чем мы говорили в моих последних 2 статьях о манипулировании битами. Если эта тема для вас нова, продолжайте и прочтите хотя бы первую здесь:
Статья I Побитовые манипуляции Часть 1
Побитовая манипуляция Часть 2
Сегодня мы рассмотрим еще несколько вопросов для интервью, которые можно решить с помощью битовых манипуляций. Но прежде чем мы это сделаем, нам просто нужно изучить еще один способ манипулирования битами в дополнение к тем, которые мы уже рассмотрели в моих предыдущих статьях.
Оператор сдвига влево и вправо в Java
Java API предоставляет нам оператор сдвига влево (<<), а также оператор сдвига вправо (>>).
Давайте посмотрим, как они работают:
Давайте составим целое число с двумя основаниями. Буквы над числом – это просто способ идентифицировать каждый компонент целого числа. Давайте установим наше целое число в переменную “a”.:
A B C D E F a = 1 0 1 0 1 1
Теперь предположим, что мы хотим сдвинуть вправо это число на два места. Мы бы написали:
a >> 2
Итак, давайте возьмем вашу “руку”, поместим ее чуть левее столбца “А” и сдвинем все целое число вправо на 2 места. Но помните, что любое число, которое помещается справа от столбца “F”, просто исчезает!
Итак, вот что мы получаем после сдвига вправо на 2
(a > > 2)
A B C D E F 1 0 1 0
Это все, что нужно для правильного сдвига.
Теперь давайте восстановим наш первоначальный номер:
A B C D E F a = 1 0 1 0 1 1
Давайте теперь сдвинем целое число, содержащееся в переменной “a”, на 2 места в противоположном направлении влево. Мы напишем это так:
a << 2
Итак, мы снова возьмем нашу “руку” и поместим ее на этот раз справа от столбца “F” и переместим целое число на два места влево:
A B C D E F a = 1 0 1 0 1 1
Но это дает нам пустые биты в столбцах “E” и “F”, как показано выше. Нам придется заполнить эти столбцы нулями, чтобы получить наш окончательный результат ниже:
A B C D E F a = 1 0 1 0 1 1 0 0
А Теперь Несколько Классных Трюков, Которые Вы Можете Использовать В Своем Интервью:
Сдвиг вправо (> >) – это то же самое, что деление на 2
Давайте возьмем десятичное число, 10. Давайте преобразуем в базу 2: 11000
Мы сдвинем двоичный файл 11000 вправо на 1 место:
1100
Двоичный код 1100 – это десятичное число 12, которое составляет половину десятичного числа 24.
Вы можете продолжать смещаться на одно место вправо и продолжать иметь наш номер, чтобы проверить это!
Установите 2 в n-й бит целого числа X
Это хороший вариант.
Нам дано двоичное целое число, скажем, 10;
A B C D 1 0 1 0
Нам также сказали, что наше “n” равно 2. Это означает, что мы должны установить (поставить единицу) в столбце B. Почему колонка B? Короче говоря, столбец B – это 2 в столбце “n”. Наше “n” было дано как “2”. Столбец B – это наш 2-й ко 2-му столбцу:
Столбец D – от 2 до 0-го столбца или столбец “единицы”, столбец C – от 2 до 1-го столбца или столбец “двойки”, столбец B – от 2 до 2-го столбца или столбец “четверки”
Мы установим наш столбец B с помощью этой простой формулы:
x | ( 1 << n)
Давайте разберемся с этим. Сначала давайте начнем с того, что находится внутри скобок в правой части побитового оператора “ИЛИ” ( |): 1 << n
Мы хотим сдвинуть целое число “1” влево на n мест. Нам дали n как “2”. Давайте сделаем это:
1 //original integer 1 0 0 // shift the original over to the left by 2 places
Теперь давайте сравним наш x, 1010, со 100, используя побитовое ИЛИ (|)
A B C D 1 0 1 0 0 1 0 0 _____________ 1 1 1 0 // 1010 | 0100
После применения побитового ИЛИ мы видим, что в нашем результате (1 1 1 0) в столбце B теперь задано как требуемая задача.
Это всего лишь две очень забавные вещи, которые вы можете сделать с помощью битовых манипуляций. Надеюсь, это разожгло ваш аппетит к большему. Использование базы 2 и битовых манипуляций позволяет точно настроить наши целые числа, которые были бы неуклюжими в базе десять.
Продолжайте воплощать свои мечты!
Намасте
Оригинал: “https://dev.to/kuddleman/interview-prep-bit-manipulation-part-iii-leo”