Функция диапазона возвращает список чисел от нуля до заданного числа минус один.Он также имеет формы с двумя и тремя аргументами (см. 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 .