Bit 연산자

rlcjf0014·2020년 6월 7일
0

백엔드

목록 보기
8/8

Introduction

주말에 시간날 때마다 정리하고 싶은 내용들을 정리해 간단하게라도 기록을 남기고 싶다.

비트 연산자

비트 연산자는 한 개 혹은 두 개의 이진수에 대해 비트 단위로 적용되는 연산인데, 쉽게 말하면 컴퓨터가 읽을 수 있는 숫자로 어느 숫자든 표현 하는 것이다. 컴퓨터는 1 과 0 밖에 읽지 못한다. 그러므로 0과 1만을 사용해 우리가 아는 다양한 숫자를 표현할 수 있는데, 자리수에 따라 2의 몇승인지 정해진다.

예를 들어, 0 같은 경우 그냥 0이다. 그리고 1이면 그냥 1이다. 1의 자리로 찍수인지, 홀수인지 표현할 수 있다. 이후 자릿수가 늘 때마다 2의 몇 승인지 정해진다. 10 이면, 십의 자리로 자릿수가 하나 늘어나서 2의 1승으로 2이다. 100은 4, 1000은 8이다. 0의 갯수로 몇 승인지 알 수 있다. 이제 이 숫자를 홀수로 만들려면 일의 자리를 1로 만들어 1을 올려주면 된다. 110 이면 2의 2승 + 2의 1승 + 0 해서 6이다. 111 이면 1만 더하니 7.

그렇게 자세한 건 모르지만 내가 코드에 적용한 개념은 비트 연산자를 사용한 마스킹이란 개념이었다.

비트 마스크

데이터의 최소 단위를 사용해 유용하게 사용할 수 있다. 비트 마스크는 정수의 이진법 표현을 활용한 기법이다. 메모리도 덜먹고 처리가 상대적으로 간단하고 빨라 (컴퓨터의 숫자이기에) 비트 마스크로 표현하면 더 유용하다. 비트 마스크로 표현한 후 비트 연산자를 통해 제어할 수 있다.

AND 연산자 (&)

대응하는 두 비트가 모두 1일 때 1을 반환. 1과 0이면 false 여서 0.
1010 & 1111 => 1010

OR 연산자 (|)

대응하는 두 비트 중 하나라도 1일 경우 1을 반환.
1010 | 1111 => 1111

XOR 연산자 (XOR)

대응하는 두 비트가 같지 않으면 1을 반환.
1010 XOR 1010 => 1111

NOT 연산자 (~)

비트의 값을 반전하여 반환.
~1010 = 0101

쉬프트 연산 (<<, >>)

00001010 << 2 = 101000
00001010 >> 2 = 000010

Application

비트 마스크는 실제로 스케줄을 표현해 데이터베이스에 저장할 때 사용했다.
월, 화, 수, 목, 금 중 어떠한 날에는 해당되고 어떠한 날에 해당되지 않는 것을 표시해 저장해야 했는데,
JSON으로 저장하는 방법, 그냥 스트링으로 저장하는 방법, 그리고 비트 마스크를 사용해 저장하는 방법들이 옵션이었다.

Sequelize 를 사용하고 있었기에 sequelize가 지원을 잘 해주고 또 저장하고 가져올 때 효율적인 방법을 선택하고 싶어
비트 마스크를 사용했다.

[0, 0, 0, 0, 0]이 기본 평일이라고 생각하면 0일 때 false, 1일 때 true로 생각할 수 있다.

배열의 index를 2의 ~승으로 생각해 숫자를 더해 integer로 데이터베이스에 저장해주고, 숫자를 가져와 클라이언트가 수월하게
처리할 수 있게 숫자를 비트 연산자로 테스트 해 들어온 그대로 반환해주면 된다.

백문이불여일견. 한번 예를 들어서 보자.
[1, 0, 1, 1, 0]을 보면 월, 수, 목이 true 이고 화, 금은 false를 표현한 것이다.
그러면 인덱스에 맞춰 더해주면, 20 + 22 + 2**3 으로 13이다.

다시 13을 들어온 배열로 비교한다면, 각 인텍스의 값을 13에 비트 연산자 AND로 하나씩 넣어줘 true인지 확인하는 것이다.
13을 1로, 2로, 4로, 8로, 16으로 테스트 해 true가 나온다면 1이고 false면 0이라는 것이다.

반복문을 잘 사용해 비트 마스크로 된 배열 데이터를 숫자로, 숫자를 배열 데이터로 변환해 줄 수 있다.

Conclusion

회사에서 시간이 훅훅 가지만 그래도 새로운 것을 매일 연마하고 배우는 것 같아 좋다. 비트 연산자는 이론이 약한 내가 거의 들어만 보고
처음 사용해 본 것이었는데 신기했다. 그렇게 복잡하게 사용한 것이 아니더라도 조금이라도 써본 부분에 만족하고 뿌듯하다.

내일도 힘내자.

출처: https://mygumi.tistory.com/361 [마이구미의 HelloWorld]

profile
Grow Joshua, Grow!

0개의 댓글