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으로 바꿀수 있다