비트 연산자란?
비트 연산자는 피연산자를 비트단위로 논리 연산한다. 피연산자를 이진수로 표현했을 때의
각 자리를 알아보자
|(OR연산자) 피연산자 중 한 쪽의 값이 1이면, 1을 결과로 얻는다. 그 외에는 0을 얻는다.
&(AND연산자) 피연산자 양 쪽의 값이 모두 1이어야만 1을 결과로 얻는다. 그 외에는 0을 얻는다.
^(XOR연산자) 피연산자의 값이 서로 다를 때만 1을 결과로 얻는다. 같을 때는 0을 얻는다.
|(OR연산자 )
대상1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 |
대상2 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 |
결과 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 |
2진수로 표현된 두 비트가 중 하나라도 1일 경우에 연산 결과가 1로 표현됨.
&(AND연산자)
대상1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 |
대상2 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 |
결과 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 |
2진수로 표현된 두 비트가 모두 1일 경우에만 연산결과가 1로 표현됨.
^(XOR연산자)
대상1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 |
대상2 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 |
결과 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 |
2진수로 표현된 두 비트가 하나는 1이고 다른 하나가 0일 경우에 연산 결과가 1로 표현됨.
^(XOR)연산한 값에 다시 ^(XOR)연산을 하게 되면 원래의 값으로 돌아오는 특징이 있어서 간단한 암호화에 사용된다.
~(비트 전환 연산자)
대상 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 |
결과 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 1 |
2진수로 표현 했을 때, 0은 1로, 1은 0으로 바꾼다. 논리 부정 연산자 '!'와 유사하다.
ex) ~10 = -11
쉬프트 연산자 <<, >>
이 연산자는 피연산자의 각 자리(2진수로 표현했을 때)를 '오른쪽 >>' 또는 '왼쪽 <<'으로 이동(shift)한다고 해서
'쉬프트 연산자(shift operator)'이다.
x << y : 정수 x의 각 비트를 y만큼 왼쪽으로 이동시킨다.(빈자리는 0으로 채워짐)
x >> y : 정수 x의 각 비트를 y만큼 오른쪽으로 이동시킨다.(빈자리는 최상위 부호비트와 같은 값으로 채워짐)
x >>> y : 정수 x의 각 비트를 y만큼 오른쪽으로 이동시킨다.(빈자리는 0으로 채워짐)
⚓10진수 8은 2진수로 '00001000'이다.
0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
✔ 8 << 2는 8의 2진수를 왼쪽으로 2칸 움직인다. (빈칸은 0으로 채워진다.)
0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
✔ 8 >> 2는 8의 2진수를 오른쪽으로 2칸 움직인다. (빈칸은 최상위 부호비트와 같은 값으로 채워진다)
0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
✔ 8 >>> 2는 8의 2진수를 오른쪽으로 2칸 움직인다. (빈칸은 0으로 채원진다)
0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
⚓10진수 -8은 2진수로 '11111000'이다.
1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 |
✔ 8 << 2는 8의 2진수를 왼쪽으로 2칸 움직인다. (빈칸은 0으로 채워진다.)
1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 |
✔ 8 >> 2는 8의 2진수를 오른쪽으로 2칸 움직인다. (빈칸은 최상위 부호비트와 같은 값으로 채워진다)
1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 |
✔ 8 >>> 2는 8의 2진수를 오른쪽으로 2칸 움직인다. (빈칸은 0으로 채원진다)
0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 |
그래서 머선 일에 쓰는게 좋응가?
비트연산에 대해 알아보면서 각 비트 연산자가 어떤연산을 하는지 2진수의 형태로 풀어 보았다.
아마 대부분의 '사람들이 그래서 어쩌라고😑' 와 같은 생각을 할것이다.
그래서 일단 쉬프트 연산자를 사용법에 대해 알아보려 한다.
x << n 은 x * 2(n제곱)의 결과와 같다
x >> n 은 x / 2(n제곱)의 결과와 같다
위의 설명과 같이 곱셈과 나눗셈이 가능하며 쉬프트 연산자가 덧셈, 나눗셈 연산자보다 프로그램의 실행속도도 빠르다
계산 관련된 프로그램을 작성할때 사용 할수 있겠다.
하지만 또 반전이 있다 가독성이 떨어진다 속도는 빠르겠지만 분명 *, / 보다 가독성이 떨어지는게 사실이니
쉬프트 연산자보다는 곱셈 나눗셈 연산자를 더 주로 사용하다가
보다 빠른 실행이 요구되어질때 적절하게 쉬프트 연산을 사용하도록 하자.
비트연산자는 ^(XOR연산자)에 주목하면 좋을 것 같다
^(XOR연산자)는 간단한 암호화나 복호화가 가능하여 직접 만들어보았다.
바로 간단하지만 암호화와 복호화가 가능한 프로그램을 만들수 있었다. 😉
비트연산과 쉬프트 연산을 공부하며 이걸 내가 필요에 의해서 코드에 작성할 일이 있을까?
하고 생각했는데 공부하다보니 의외로 쓸곳이 있다는걸 알게 되었고
또 그 쓸곳이 쉬프트 연산의 곱셈 나눗셈 이라는걸 알고 나니 기억의 조작인지
예전에 코드를 읽다가 한두번쯤 본것 같은 착각도 들었다.
또 내가 애정하게 되버린 XOR연산자를 이용해 간단한 암호화와 복호화 프로그램을 작성하면서
쉬프트연산, XOR연산을 내가 필요해서 쓰는 날이 오길 기대하게 됐다.
댓글