#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
для получения маски наименее значимого установленного бита, а затем выполняет то же самое, что и исходное выражение. Это позволило бы найти первый запуск единиц и сбросить его.