Пожалуйста, помогите мне понять немного сдвиг операции - PullRequest
0 голосов
/ 22 марта 2011
def different(s):
   x = len(s)
   for i in range(1, 1 << x):
      u.append([s[j] for j in range(x) if (i & (1 << j))])

Он принимает список и создает различные комбинации

(a,b,c) = ((a,b,c),(a,b),(a,c) ...)

Но что делает диапазон? От 1 до чего. Я не понимаю "<<"

а также if (i & (1 << j)) что это делает? Он проверяет, если я и 2 в степени j? Не имеет никакого смысла для меня.

Ответы [ 2 ]

5 голосов
/ 22 марта 2011

<< - двоичный оператор сдвига влево. 1 << x - это способ сказать два в степени х.

4 голосов
/ 22 марта 2011

Функция диапазона возвращает список чисел от нуля до заданного числа минус один.Он также имеет формы с двумя и тремя аргументами (см. doc для получения дополнительной информации):

range(n) == [0, 1, 2, ..., n - 1]

<< является оператором левого сдвига и имеет эффект умножениялевая сторона в два раза превосходит правую часть:

x << n == x * 2**n

Таким образом, вышеприведенная функция диапазона (range(1, 1 << x)) возвращает [1, 2, 3, ..., 2**x - 1].

В секундах использования<<, сдвиг влево используется в качестве битовой маски.Он перемещает 1-бит в j -й бит и выполняет побитовые и с i , поэтому результат будет ненулевым (и пройти тест if) тогда и только тогда, когда установлен j -й бит i .Например:

j = 4
1 << j = 0b1000 (binary notation)

i = 41 = 0b101001
i & (1 << j) = 0b101001
             & 0b001000
             = 0b001000 (non-zero, the if-test passes)

i = 38 = 0b100110
i & (1 << j) = 0b100110
             & 0b001000
             = 0b000000 (zero, the if-test fails)

Короче говоря, x & (1 << y) не равен нулю, если установлен y -й бит x .

...