프로그래머스의 카카오 신입공채 코테 문제 풀어보다가 내가 비트 연산자에대해 공부하지 않았다는걸 깨달았다.. (오이런)
어찌어찌 if ~ else로 풀긴 풀었는데 나중에 해설보니 10줄 이내로 끝낼수있는 문제가 아니던가..(33줄 나왔던 내 코드,,)
그래서 공부해본다 비트 연산자!
우선 비트 연산자 ==> bit 단위로 논리 연산을 할 때 사용하는 연산자!
비트 단위로 전체 비트를 왼쪽이나 오른쪽으로 이동시킬때도 사용한다.
(솔직히 이것만 읽었을때 무슨소린지 못알아들었음)
1byte -> 8bit 기준으로 비트 표현
비트 연산자 | 설명 |
---|---|
& | 대응되는 비트가 모두 1이면 1을 반환 (AND 연산) |
\ | 대응되는 비트 중에서 하나라도 1이면 1을 반환 (OR 연산) |
^ | 대응되는 비트가 서로 다르면 1을 반환 (XOR 연산) |
~ | 비트를 1이면 0으로, 0이면 1로 반전 (NOT 연산) |
<< | 지정한 수만큼 비트들을 전부 왼쪽으로 이동시킴 (left shift 연산) |
>> | 부호를 유지하면서 지정한 수만큼 비트를 전부 오른쪽으로 이동시킴 (right left 연산) |
**두번째 줄의 비트연산자는 \이 아니라 |이다.
다음과 같이 각 비트마다 비교를 했을 때 두 비트가 모두 1일때만 1을 반환하는 것이다.
0과 1 / 1과 0 의 식으로 다른 경우는 모두 0을 반환하는 것이 &연산
.
비트를 이동시키는 연산자로 <<
와 >>
이 있다.
자 시프트 연산자를 이해해보자.
정수 10이 있다면 이걸 2진수로 변환했을 때 00001010
으로 표현할 수 있다.
여기에 다음과 같이 시프트 연산자를 사용해보자 👉 10<<2
즉, 정수 10을 2진수로 변환한 비트 값을 왼쪽으로 2칸 이동하라.
그럼 00101000
이와 같이 변한다.
이 2진수를 다시 10진수로 변환하면 정수 40이 나온다.
40 = 10 * 4
= 10 * 2^2
(-> 이걸로 x<<n은 x*2^n이라는 공식이 성립할 수 있다고 한다.)
이번엔 >>
을 사용해보자.
위의 정수 10에 사용해 비트 전체를 오른쪽으로 2칸 이동시키면 00000010
이 된다.
이렇게 되면 00001010
에서 오른쪽 2번째 칸의 1이 사라지게 되는데 이렇게 허용 범위를 넘어가면 없는 값처럼 사라진다.
그래서 만약 10>>2
이 아니라 10>>4
가 되면 그냥 00000000
이 되면서 0만 남아있게 된다.
==> 데이터 손실 발생
비트 연산자는 이런식으로 이해하면 되는 것이였다!
생각보다 간단하지만 시프트 연산자 사용할때는 주의가 필요하겠어요.
더 자세한건 아래 참고.
비트연산자 참고
비트연산자 - 시프트 연산자