다음과 같은 수식을 생각해 보자: 1 □ 1 □ 1 □ 1 □ 1 □ 1 □ 1
각 빈칸 □에는 덧셈 연산자(+
), XOR 연산자(^
), AND 연산자(&
), OR 연산자(|
) 중 원하는 연산자를 독립적으로 선택하여 넣을 수 있다.
연산자의 우선순위는 아래와 같다. 아래의 우선순위는 프로그래밍 언어(C, C++, Java, Python)의 동작과는 다르다는 점에 유의하라.
^
, &
, |
연산자의 우선순위는 서로 동일하다. 같은 우선순위를 가진 비트 연산자는 반드시 왼쪽에서 오른쪽으로 차례대로 계산한다.+
)는 비트 연산자보다 우선순위가 낮으며, 항상 가장 마지막에 계산한다.즉, 전체 수식을 계산할 때는 먼저 덧셈 연산자(+
)를 기준으로 여러 개의 부분식으로 나눠서 각각의 값을 구한 다음, 이 부분식의 결괏값들을 더해 최종적으로 전체의 결괏값을 구한다. 각 부분식 내부는 비트 연산자로만 구성되며 왼쪽에서 오른쪽으로 차례대로 계산한다.
예시로, 1 ^ 1 & 1 + 1 | 1 & 1 + 1 = ((1 ^ 1) & 1) + ((1 | 1) & 1) + 1 = 2이다.
모든 빈칸 □에 연산자 4가지(+
, ^
, &
, |
)를 독립적으로 자유롭게 넣을 수 있으므로, 빈칸을 채워 수식을 완성할 수 있는 방법의 수는 총 가지 있다.
각각의 완성된 수식에 대해 결괏값을 계산한 후 모두 더한 값은 얼마인가?