다음으로 편의 함수 세 개를 정의하겠습니다.
코드 11-2
def parent(self, idx):
return idx >> 1
def left(self, idx):
return idx << 1
def right(self, idx):
return (idx << 1) + 1
코드 11-2를 보면, 인덱스를 매개변수로 받아 그 노드의 부모 노드의 인덱스를 반환하는 parent() 메서드, 왼쪽 자식을 반환하는 left() 메서드, 오른쪽 자식을 반환하는 right() 메서드입니다. 함수 구현에서 비트 연산자를 사용했습니다. parent에서 idx>>1 대신에 idx//2로 하고, left에서 idx<<1 대신에 idx*2를 해도 됩니다. 하지만 그렇게 나눗셈이나 곱셈 연산을 하게 되면 4바이트 정수 연산은 내부적으로 시프트 연산 32번과 덧셈 연산을 수행해야만 합니다. 하지만 2의 승수를 계산할 때는 단순히 비트 연산자를 사용하면 내부적으로 시프트 연산을 한 번만 하면 되기 때문에 매우 빠릅니다. (자세한 설명은 하드웨어 아키텍처에 관한 내용이므로 이 책 범위를 벗어납니다. 2의 승수를 계산할 때는 비트 연산자를 이용하는 것이 빠르다는 정도만 기억해 두면 됩니다.)