비트 연산자bitwise operator
생김새는 논리연산자와 비슷하게 생겼지만, 이름에서 알 수 있듯 비트bit단위 데이터를 다룰 때 사용하는 연산자다.
연산은 물론, 비트 단위로 비트 전체를 왼쪽, 오른쪽으로 이동시킬 때에도 사용한다.
* 미리 알아둘 것.
컴퓨터 시스템에서 모든 정수는 고정된 비트 수를 사용해서 표현된다(32비트 혹은 64비트).
예를 들어 3의 경우, 이진수로 표시하자면 11이겠지만 컴퓨터 시스템에서는 64비트(혹은 32비트)로 표현되어, 000...0011(총 64자리) 로 표현되는 것이다.
설명의 편의를 위해 꼭 필요한 연산자가 아니면 최대한 간략하게 비트를 생략해서 설명하도록 하겠다.
&(AND), |(OR)
두 데이터의 bit를 비교해서
- & : 같은 위치 bit가 둘 다 1이면 1을, 아니면 0을 반환한다.
- | : 같은 위치 bit가 둘 중 하나라도 1이면 1을, 아니면 0을 반환한다.
각각 예시를 들어 보자.
3은 2진수로 표현하면 011, 6은 110이다(위에서 언급했듯 실은 64비트 꽉 채워서 000... 으로 표현되겠지만, 여기선 전부 표현할 필요가 없으니 최대한 생략하였다).
위치를 비교해서 1을 반환해 보면, & 연산의 경우 그 결과는 010이고, | 연산의 경우 그 결과는 111이다.
2진수 010은 10진수로 표현하면 2가 되고 111은 7이 된다.
따라서 & 연산의 최종 출력값은 2, | 연산의 최종 출력값은 7이 나오게 된다.
^(XOR)
두 데이터의 bit 위치를 비교해서 서로 다른 값이면 1을 반환한다.
011과 110의 XOR 연산 결과는 101이 나오게 되고, 이는 10진수로 표현하면 5다.
따라서 ^ 연산의 최종 출력 결과는 5가 나오게 된다.
~(NOT)
하나의 데이터의 bit를 전부 반전시킨다. 1은 0으로, 0은 1로.
포스팅 최상단에 *미리 알아둘 것 어쩌구... 하고 설명을 써 놓은 이유가 바로 이 연산자 때문이다.
컴퓨터 시스템에서 정수가 어떻게 표현되는지 알지 못했다면 왜 이런 값이 나오는지 알지 못했을 테니까.
예시와 같은 결과가 나온 이유를 조금 풀어서 설명해보자면 다음과 같다.
컴퓨터 시스템에서 모든 정수는 64비트의 2진수로 표현된다. 즉 3은 000...011인 것.
이 2진수에서, 0과 1을 모두 반전시키면? 111...100이다. 1이 62개 이어지고, 0이 2개.
그 2진수를 10진수로 변환한 것이 바로 저 출력값인 것이다 .
<<(Left shift), >>(Right shift)
모든 bit를 왼쪽/오른쪽으로 지정된 수 만큼 이동시킨다.
이동으로 인해 새로 생기는 bit는 0으로 채워진다
=> 예를 들어, 100...001이라는 수가 있고 이 수를 왼쪽(1), 오른쪽(2)으로 1칸씩 이동시킨다고 하자.
(1) 맨 왼쪽의 1은 사라지고, 맨 오른쪽에서는 새로운 bit가 생김. 새로 생긴 bit는 0이 되므로, 옮긴 후의 수는 000...010이 된다.
(2) 맨 오른쪽의 1은 사라지고, 맨 왼쪽에서는 새로운 bit가 생김. 새로 생긴 bit는 0이 되므로, 옮긴 후의 수는 010...000이 된다.
이런 연산자를 어디에 쓸까 궁금했는데, 다음과 같은 효과?가 있다고 한다.
우선, 빠르다.
연산 속도의 빠르기는 비트 연산 > 숫자 연산 > 문자 연산 순이라고 한다. 비트 연산자가 하드웨어 수준에서 지원되기 때문이며, 복잡한 수학 연산보다 훨씬 적은 사이클을 사용한다고 한다.
게다가 메모리도 많이 절약할 수 있어서 메모리 사용량이 중요한 임베디드 시스템이나 모바일 애플리케이션에서 유용하다고도 하고, 복잡한 코드를 간결하게 표현할 수 있어서 가독성 측면이나 관리 측면에서도 좋다고 한다.
내가 쓸 일은... SQL 코딩 테스트를 풀 때 외에 또 있을까... 싶다.
+ ) 덧.
MySQL에서는 0과 1로 이루어진 문자열 앞에 b(bit)를 붙여 2진수를 표현할 수 있다!
ex) b'011' = 3, b'110' = 6
'STUDY > SQL, DB' 카테고리의 다른 글
[DB] DB / DB 생성 / SQL 명령 (0) | 2024.03.19 |
---|---|
[MySQL] temporary table (0) | 2024.03.05 |
[MySQL] WITH RECURSIVE 구문 (0) | 2024.02.19 |
[SQL] 데이터 타입 훑어보기 (0) | 2024.02.15 |
[DBeaver] Data import하기 (0) | 2024.02.15 |