2011-03-22 4 views
0
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를 다른 조합을 목록을 소요하게

) etc ..) 그러나 범위는 무엇을합니까? 1에서 무엇까지. 나는 "< <" 나 비트 시프트 연산을 이해하는 데 도움이됩니다

또한, 경우에 (내가 & (1 < < J))이 무엇을합니까 이해하지? i와 2가 j의 거듭 제곱인지 확인합니다. 나에게 어떤 의미가 없습니다 :/

+0

많은 사람들이 당신을 돕기 위해 많은 노력을했습니다. 이 질문을 삭제하면 대표를 잃을 수 있습니다. 다른 방법으로 문제가 해결되면 솔루션에 대한 답을 남겨두고 옵션을 사용할 수있을 때 선택하십시오. 유사한 문제가있는 사람들을 돕고 도움을 주려는 사람들에게 벌점을주지 않습니다. (또한 당신이 염려했던 것들을 고쳤습니다) – Will

답변

4

range 함수는 0부터 주어진 숫자에서 1을 뺀 숫자 목록을 반환합니다. 또한, 2 차원 및 3 인수 형태 (자세한 내용은 doc 참조)를 가지고

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

<< 왼쪽 시프트 연산자를, 그리고 전원을 2로 좌측 승산하는 효과를 갖는다 우측 :

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

따라서 상기 범위 함수 (range(1, 1 << x))는 [1, 2, 3, ..., 2**x - 1]를 반환한다.

초 단위로 <<을 사용하면 왼쪽 이동이 비트 마스크로 사용됩니다. 그것은 J 번째 비트에 1 비트의 이동 및 실행하는 비트 단위 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)는 X의 Y 번째 비트가 설정 IFF에 비 - 제로이다.

5

<<은 이진 왼쪽 시프트 연산자입니다. 1 << x은 x의 힘을 2로 표현하는 방법입니다.

+0

2 ** x와 같습니까? – nils

+0

@nils : 예, 그렇습니다. – icktoofay

+1

@nils, 네,하지만'3 << 10'은'3 * 2 ** 10'보다 2 배 빠릅니다. – eumiro

관련 문제