본문 바로가기

STUDY/SQL, DB

[MySQL] 비트(bit) 연산자

비트 연산자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을 반환한다.

^(XOR)

 

011과 110의 XOR 연산 결과는 101이 나오게 되고, 이는 10진수로 표현하면 5다.

따라서 ^ 연산의 최종 출력 결과는 5가 나오게 된다.

 

 

~(NOT)

하나의 데이터의 bit를 전부 반전시킨다. 1은 0으로, 0은 1로.

~(NOT)

 

포스팅 최상단에 *미리 알아둘 것 어쩌구... 하고 설명을 써 놓은 이유가 바로 이 연산자 때문이다.

컴퓨터 시스템에서 정수가 어떻게 표현되는지 알지 못했다면 왜 이런 값이 나오는지 알지 못했을 테니까.

 

예시와 같은 결과가 나온 이유를 조금 풀어서 설명해보자면 다음과 같다.

컴퓨터 시스템에서 모든 정수는 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이 된다.

>>(Right shift)

 

 

이런 연산자를 어디에 쓸까 궁금했는데, 다음과 같은 효과?가 있다고 한다.

 

우선, 빠르다.

연산 속도의 빠르기는 비트 연산 > 숫자 연산 > 문자 연산 순이라고 한다. 비트 연산자가 하드웨어 수준에서 지원되기 때문이며, 복잡한 수학 연산보다 훨씬 적은 사이클을 사용한다고 한다.

 

게다가 메모리도 많이 절약할 수 있어서 메모리 사용량이 중요한 임베디드 시스템이나 모바일 애플리케이션에서 유용하다고도 하고, 복잡한 코드를 간결하게 표현할 수 있어서 가독성 측면이나 관리 측면에서도 좋다고 한다.

내가 쓸 일은... 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