1 << 0 = 0b1 (1)       # 00001
1 << 1 = 0b10 (2)      # 00010
1 << 2 = 0b100 (4)     # 00100
1 << 3 = 0b1000 (8)    # 01000
1 << 4 = 0b10000 (16)  # 10000

1을 왼쪽으로 밀어서 비트 나타내기

if (A & (1 << i)) != 0:
    print(f"정점 {i}는 방문됨")

& → and 연산자

and는 둘 다 1이어야만 1이 된다

0은 방문하지 않았다는 의미

둘의 and 연산을 수행했을 때 방문 비트에는 1이 하나도 있으면 안됨 (0)

방문 비트

A |= (1 << i)  # 정점 i를 방문했다고 표시

or 연산은 둘 중 하나만 1이 되어도 1이 된다

따라서 정점 i를 방문했다고 마스킹이 가능하다

제외 비트

A &= ~(1 << i)  # 정점 i를 방문 취소

and는 둘 다 1이어야만 1로 마스킹되는데, not을 사용하여 비트가 0이 되었으므로 해당 비트를 0으로 바꿀수 있다