Добро пожаловать снова в очередной эпизод подготовки к собеседованию. В последнее время мы немного поиграли с манипуляциями. Если вы не уловили мою первую статью, в которой излагаются основы, быстро прочтите ее сейчас, так как мы продолжим с того места, на котором она остановилась:
Побитовая Манипуляция, Часть I
В качестве краткого обзора помните, что “битовая манипуляция” означает, что мы работаем с базой 2 вместо базы 10. Причина, по которой мы заботимся о том, что работа в базе-2 дает нам более высокий уровень контроля над нашими данными. Думайте о манипуляциях с долотами как о работе с пилочкой для ногтей вместо молотка.
Итак, теперь, когда вы знаете некоторые основные операции по обработке битов из моей первой статьи, давайте используем эти операции, чтобы сделать несколько интересных вещей, а также помочь нам ответить на некоторые возможные вопросы интервью.
Очистите Наименее значимый бит, который Набор
Вопрос, который вы можете получить, звучит так:” Очистите наименее значимый бит набора в заданной последовательности битов”
Во-первых, давайте определимся с терминами. Что они подразумевают под “значительным” битом?
Простой. Посмотрите на эту последовательность битов:
X 1010001110000001000000010000111100000101010
Теперь приложите палец к экрану (продолжайте, я не скажу!) в крайней правой части последовательности (помечено знаком “X”). Теперь проведите пальцем вдоль последовательности слева.
Теперь вы перемещаете палец от наименее значимого бита к более значимым битам.
<<---<<<<---<<<<
X 1010001110000001000000010000111100000101010 Y
В нашем примере бит, отмеченный знаком “X”, является наименее значимым, а “Y” – наиболее значимым битом. Степень “значимости” возрастает по мере того, как мы перемещаем палец вдоль последовательности битов справа налево.
Теперь вернемся к нашему первоначальному вопросу. Давайте возьмем свежую последовательность битов:
Нас просят создать алгоритм, который очищает наименее значимый бит набора.
Если мы положим палец на крайнюю правую часть последовательности (ячейка E3), мы переместим палец влево вдоль последовательности и там перейдем от наименее “значимого” бита к более значимому биту. Первый бит набора, к которому мы подходим, – это “1” в ячейке D1, отмеченной красным цветом. Это тот бит, который нам нужно очистить и превратить в ноль.
В нашем алгоритме нам нужно выполнить две основные задачи: 1) найти наименее значимый бит набора, а затем “очистить” его, то есть установить его равным нулю.
Теперь начинается самая крутая часть. Самый простой способ, которым мы можем найти и очистить наименее значимый бит, – это использовать битовую манипуляцию. И вот формула, которая работает каждый раз для этой проблемы:
x & ( x - 1)
Давайте просто разработаем приведенную выше формулу!
Нам дали “х”.:
Теперь давайте наберем x-1 в строке 5:
Наконец, давайте выясним, к чему сводится выражение x & (x-1):
Просто чтобы ознакомиться с нашей операцией “&”:
В Колонке А: “1” в строке 3 и “1” в строке 5 преобразуются в “1” в строке 8.
Столбец B: 0 и 0 преобразуются в 0
Столбец C: 1 и 1 преобразуются в 1
Столбец D: 1 и 0 преобразуются в 0
Столбец E: 0 и 1 преобразуются в 0
Помните, мы хотели найти и очистить наименее значимый бит в строке 3, бит, отмеченный красным. И это то, что мы сделали! В строке 8 мы видим ячейку D8, отмеченную синим цветом, где ячейка была очищена.
Наша секретная формула: x & (x-1) очистила наименее значимый бит.
ещё один
Давайте рассмотрим еще одну проблему. Учитывая последовательность
биты (мы начнем с того же, который мы использовали)
Нас просят написать алгоритм, который устанавливает наименее значимый очищенный бит.
На изображении выше нам дана последовательность в строке 3. Наименее значимый очищенный бит находится в ячейке E3. Мы хотим, чтобы наш алгоритм выбрал эту ячейку и установил ее так, чтобы у нас осталась последовательность битов в строке 8.
Как мы это делаем?
Просто! Мы воспользуемся другой формулой манипуляции с магическими битами. На этот раз это:
x | (x + 1)
Давайте сделаем это!
У нас уже есть “x”, поэтому давайте заполним (x + 1) в строке 5 ниже, а затем проверим, соответствует ли он нашему желаемому результату в строке 8:
Мы видим, что мы успешно нашли наименее значимый очищенный бит в нашей заданной последовательности (ячейка E3) и установили его в нашем результате в ячейке E8 (красным цветом) в строке 8. Вот так!
Это всего лишь пара трюков. Есть и другие, поэтому я надеюсь, что это разожжет ваш аппетит и повысит вашу оценку манипуляций с битами. Такой взгляд на цифры позволяет нам внести некоторые незначительные изменения в наши ценности, которые в противном случае были бы невозможны.
Продолжайте воплощать свои мечты!
Оригинал: “https://dev.to/kuddleman/interview-prep-more-on-bit-manipulation-25mm”