코딩 테스트 시 필요한 이유

BitMask는 코딩 테스트에서 많이 활용되는 기법은 아니다. 만약 BitMask를 활용해야 하는 문제라면 개인적으로는 다른 문제를 푸는 게 더 효율적이라 생각할 정도로 굳이? 싶은 기법이긴 하다.

하지만 개념 및 사용 방법을 알지만 효율을 위해 다른 문제를 푸는 것과 아예 몰라서 다른 문제를 푸는 것은 매우 다른 상황이라고 생각하기 때문에 한 번 정리해보겠다.


아래에 나오는 모든 수들은 10진법이 아닌 2진법이라고 간주하고 정리하겠다.
이후 어떻게 10진법에서 BitMask 기법을 활용할 수 있는지 언급하겠다.

Shift 연산(>>, <<)

왼쪽 또는 오른쪽으로 비트를 옮긴다.

00100 << 2 // 결과 : 10000
00100 >> 2 // 결과 : 00001

XOR 연산(^)

대응하는 두 비트가 같으면 0, 다르면 1을 반환한다.

1010 ^ 1111 // 결과 : 0101

AND 연산(&)

대응하는 두 비트 모두 1일 때만 1을 반환한다.

1010 & 1111 // 결과 : 1010

OR 연산(|)

대응하는 두 비트 중 하나라도 1이라면 1을 반환한다.

1010 | 1111 // 결과 : 1111

NOT 연산(~)

비트의 값을 반전시킨다.

~1010 // 결과 : 0101

실제 BitMask 활용법

이진법이라면 위 예시처럼 활용하면 되겠지만 안타깝게도 우린 자바에서 10진법을 많이 활용한다.

예를 들어 00100 << 2를 수행하고 싶을 경우 8<<2를 수행하거나 Integer.parseInt("00100", 2) << 2처럼 귀찮은 과정을 거쳐야 하는 것이다.

이런 과정을 거치지 않기 위해 BitMask를 활용할 땐 꼭 "Shift 연산"과 결합하여 많이 활용한다.

예시 2개 정도를 보며 어떻게 Shift 연산을 통해 BitMask 기법을 활용하는지 확인해 보자.

"00000" 이진법에서 "01000"으로 값을 바꾸기

0 | (1 << 4)

"01001" 이진법에서 "00011"으로 값을 바꾸기

int origin = 9; // 01001
(origin >> 2) | 1 // (origin >> 2) | 1 -> (00010) | 1 -> 00011

추가로 BitMask는 주로 배열 Index로 쓰는 경우가 많아서 만약 16Bit를 넘어갈 경우 다른 방법을 생각해보는 것도 좋다.

profile
혹시 틀린 내용이 있다면 언제든 말씀해주세요!

0개의 댓글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN