Что делает "" "if ((counter & (1 << j))> 0):" ""? - PullRequest
0 голосов
/ 25 ноября 2018

Я пытаюсь распечатать все подмножества массива.Я сталкивался с этим, если утверждение в одном из решений.Что это делает, если выполняется условие?

if ((counter & (1 << j))> 0):

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

Оператор & является побитовым оператором.Дополнительная информация здесь .

В основном, если мы рассмотрим счетчик как двоичный файл:

counter = 0b0010
1 << j -> with j = 0 

j будет позицией, которую вы хотите оценить с помощью 1.

Следовательно, в этом случае оператор IF не будет выполнен, поскольку оператор AND вернет 0.

Но с:

counter = 0b0010
1 << j -> with j = 1

Оператор IF будет выполнен, потому чтооператор AND вернет 1.

Чтобы понять немного больше, вы можете поиграть со следующим фрагментом кода и изменить значения счетчика и j:

counter = 0b0100
j = 2

if((counter & (1 << j)) > 0):
    print("True")
else:
    print("False")
0 голосов
/ 25 ноября 2018

Ваше утверждение:

if ( (counter & (1 << j)) > 0 ):

Это некоторые побитовые операции.Давайте разберем это:

  • (1 << j) генерирует число 0b1 и сдвигает его влево на j мест - j должно быть целым числом.Это похоже на выражение 2**j или 2 для j-й степени, но выполнение этого с помощью оператора сдвига битов << дает понять, что мы выполняем побитовые операции.
  • counter & (1 << j)принимает результат этой последней операции и выполняет побитовое and с переменной counter.Кажется, что j является спецификатором для битовой маски - он сообщает, какой бит важен для регистрации в counter.Поскольку все, что производит (1 << j), будет иметь только один 1 в своем двоичном представлении, выражение counter & (1 << j) всегда будет давать либо степень 2, либо 0.
  • > 0 проверяет, было ли число, которое былобыло произведено 0.

В общем, это довольно сложный способ проверить, равен ли j th бит справа от counter 1 или 0.Не видя остальной части вашего кода, невозможно сказать, что строка делает в контексте, но, надеюсь, это даст вам достаточный намек на то, что вы пытаетесь выяснить.

...