Как работает выражение «x

#bit-manipulation #bitwise-operators #bit-shift #bitwise-and

#битовая манипуляция #побитовые операторы #сдвиг бит #побитовое — и

Вопрос:

В тексте, который я читал, говорится, что:

x amp; (x (1 << n)) = x, при этом набор битов (возможно, длины 0), начинающийся с бита n, очищен.

Я попытался ввести разные значения в консоль python и увидел, что:

 >>> 5 amp; (5   (1 << 2))
1
  

Однако, когда я попытался ввести другие значения вместо 2, я получил 5 в качестве ответа. Я попытался ввести значения от 1 до 7.

Я пытался вывести выражение, но не смог.
Какое должно быть разумное объяснение тому же? И как это работает?

Комментарии:

1. что он должен делать?

Ответ №1:

Я попытался ввести значения от 1 до 7 [для n]

n = 0 тоже нормально. На самом деле давайте сначала рассмотрим этот случай. Итак x amp; (x 1) .

Если x нечетно, то x имеет вид a01k (некоторая битовая строка a , за которой следует ноль, за которым следуют k единицы). Добавление к нему 1 перенесет все конечные значения и превратит его в 10k. И это с x отменяет старые конечные единицы новыми конечными нулями, а новая 1, которая появилась со старым 0. a остается неизменной. Другими словами: конечные значения были сброшены.

Если x четно, то добавление 1 к нему не выполняется, единственный эффект заключается в том, что младший значащий бит становится установленным. И с x затем снова сбрасывает этот бит. В целом ничего не происходит.

Если n не равно нулю, то это как если бы n младших значащих битов там не было. Добавление не влияет на них, поэтому И тоже не влияет. Таким образом, в целом, x amp; (x (1 << n)) можно описать как «если есть запуск, начинающийся с позиции n , обнулите этот запуск, иначе ничего не делайте».

Потенциально интересным вариантом является x amp; (x (x amp; -x)) , который сначала использует x amp; -x для получения маски наименее значимого установленного бита, а затем выполняет то же самое, что и исходное выражение. Это позволило бы найти первый запуск единиц и сбросить его.