티스토리 뷰
카카오2017 신입 공채 1차 코딩테스트의 1번 문제가 비트연산자를 이용한 문제가 나와서 해당 문제를 풀기 위해 비트연산자를 다시 공부해보았다. 비트연산자에 대해 학습 흥미도가 떨어진다면 해당 문제를 푸는 것을 목표로 삼아보자. 카카오 2017 신입 공채 1차 코딩 테스트 문제 해설
비트연산자란?
피연산자(숫자)를 비트 단위(2진수)로 다루기 위한 연산자이다. (설명은 Java로 진행한다.)
10진수를 2진수 문자열(String)으로 변환하기
비트연산자 일지라도 자바에서 비트연산자는 10진수의 숫자로 진행해야 한다. 하지만 2진수로 변환된 숫자를 직접 보지 않으면, 연산이 제대로 되고 있는지 알기가 어렵다. Integer.toBinaryString() 메소드를 이용하여 10진수의 숫자를 2진수의 문자열로 바꿔주는 방법을 알면 실습시에 많은 도움이 된다. int는 32bit로 구성되어 있지만, 문자열로 변경시에 앞쪽 자릿수가 0이면 모두 생략된다. ex)0100 → 100
(만약 자릿수를 맞춰 주고 싶다면 String.format을 이용합니다.)
ex)String.format("%04d", Integer.parseInt(Integer.toBinaryString(숫자))
int a = 8;
String bitStr = Integer.toBinaryString(a);//문자열 "1000"으로 변환
참고로 2진수 문자열을 10진수 숫자로 바꾸는 방법은 Integer.parseInt()메소드를 이용한다.
String bitStr = "1000";
int b = Integer.parseInt(bitStr, 2); //두번째 매개변수로 문자열이 '2진수' 임을 명시
이항연산자
& (AND 연산자) - 비교하는 같은 자릿수의 비트가 모두 1일 경우 1, 아니면 0을 얻는다.
int a = 7; //0111
int b = 2; //0010
int result = a&b; //0010 (실제 결과값은 10진수 2)
| (OR 연산자) - 비교하는 같은 자릿수의 비트중에 하나라도 1일 경우는 1, 아니면 0을 얻는다.
int a = 7; //0111
int b = 2; //0010
int result = a|b; //0111 (실제 결과값은 10진수 7)
^ (XOR 연산자) - 비교하는 같은 자릿수의 비트가 다르면 (1,0 혹은 0,1)이면 1, 같으면 0을 얻는다.
int a = 7; //0111
int b = 2; //0010
int result = a^b; //0101 (실제 결과값은 10진수 5)
비트 전환 연산자
~(비트 전환 연산자) - 2진수로 표현 했을 때, 0을 1로, 1은 0으로 바꾼다.
a = 7; //0111
int result = ~a; //11111111111111111111111111111000
//(실제 결과값은 10진수 -8)
앞서서는 편의를 위해 4bit 단위로만 표시했지만, 실제로 int는 32bit(8byte)이다. 편의상 표기한 4bit 앞쪽도 모두 0으로 채워진 것이 였기에 전환 연산자를 사용하면 32bit가 모두 표기된다.
쉬프트 연산자
피연산자를 2진수로 표현했을 때, 자릿수를 이동 시킨다.
- x<<n - 비트를 왼쪽으로 n번 이동 시킨다. 빈자리는 0으로 채워진다.
int a = 7; //0111
int result = a<<2; //11100 (실제 결과값은 10진수 28)
//4bit 단위로만 표시 한다면, 앞자릿수는 버리고 1100으로 표시한다.
- x>>n - 비트를 오른쪽으로 n번 이동 시킨다. 빈자리는 0으로 채워진다. 만약 부호비트 (맨 앞에 비트)가 1이면(즉, 음수이면) 1로 채워진다.
int a = 7; //0111
int result = a>>2; //0001 (실제 결과값은 10진수 1)
int b = -7; //11111111111111111111111111111001
int result2 = b>>2; //11111111111111111111111111111110
//(실제 결과값은 10진수 -2)
- x>>>n - 비트를 오른쪽으로 n번 이동시킨다. 부호비트에 상관없이 무조건 0으로 채운다.
int c = -7; //11111111111111111111111111111001
int result3 = c>>>20; //111111111111
//(실제 결과값은 10진수 4095)
쉬프트 연산자의 활용
- x << n 의 연산결과는 x *(2^n) 과 같다.
- x >> n 의 연산결과는 x / (2^n) 과 같다.
쉬프트 연산자를 이용하면 같은 연산이라도 빠르게 연산이 가능하다. 연산 속도를 극단적으로 올려야 할 때 사용 할 수 있다.
'Algorithm' 카테고리의 다른 글
탑코더(TopCoder) 알고리즘 - The Panlindrome (0) | 2018.12.22 |
---|---|
프로그래머스 알고리즘 - 타겟 넘버 (0) | 2018.12.21 |
멱집합 (부분집합 - Power Set) 알고리즘 (0) | 2018.12.19 |
재귀 알고리즘 문제 해결하기 (0) | 2018.12.16 |
후위표기식 (Postfix expression) 계산법 (0) | 2018.10.23 |