본문 바로가기
TIL/따배씨

비트 다루기(2021-01-30)

by Dev_Dank 2021. 1. 30.

15.1 비트단위 논리 연산자

지금까지 사용한 논리 연산자(&&, ||, !)는 어떤 자료형의 상수나 변수에 적용 되는 것이었다. 

비트단위로 이루어지는 논리 연산자는 이하와같다. 

비트단위 연산자가 필요한 이유는 이하와 같다. 

만약 게임내에서 1 캐릭터의 8가지 장비상태를 표시하기위해서 가장 작은 자료 단위인 char를 쓸경우 총 8바이트(=64비트)가 필요하다. 그런데 있다와 없다. 2가지만 표현하는 것은 1비트로도 가능한데 가장 작은 자료형인 char를 써도 결국 최소 1바이트(=8비트)를 사용하게 된다.

-> 따라서 char 하나에 있는 1바이트(=8비트)를 활용해서 효율적으로 사용하는것 . 

 

각자릿수 비트 끼리 and 연산을 해서 결과(4)가 나온다. 
각자릿수 비트 끼리 or 연산을 해서 결과(7)가 나온다. 
xor은 기본적으로 or연산인데 둘다 1이면 0이 나온다. 
비트와이즈 not은 단항연산자로 각 자릿수 비트를 반대(not)으로 바꾸는 것

15.5 2의 보수 표현법 확인해보기

부호가 있는 정수를 2진수로 표현하기 위해서는 2의 보수(2's Complement) 표현법을 사용한다. 

각 비트를 거꾸로 바꾸고 1을 더해주면 된다. 

15.6 비트단위 쉬프트 연산자

Shift: 식당에서 늦게온 사람에게 자리를 만들어 주기 위해 먼저온 사람들이 모두 일어나서 옆으로 한칸 이동하는 모습을 떠올려보면 좋다. 

기본적인 사용법은 이하와 같다.

이렇게 쓸수도 있다. 

15.7 비트단위 연산자의 다양한 사용법

게임아이템을 예시로 들어 생각하면 이해 하기쉽다.

먼저 전처리기에 쉬프트 연산자를 이용해 각아이템별로 차지할 비트 자리를 작성한다. 

그 이후 맨처음 flag에 아무것도 없다는 상태로 표시를 해준후 아이템을 장착시키거나 없에거나 하는식의 실험을 해볼수있다. 

참고로 이런 특성을 이용해서 원하는 특정부분만 표시하는 Trimming도 가능하다. 

0xF가 무슨의미 인지는 이하의 링크 참조. 

stackoverflow.com/questions/8186965/what-do-numbers-using-0x-notation-mean#:~:text=In%20C%20and%20languages%20based,1024%2C%20or%20one%20binary%20K.

stackoverflow.com/questions/12398889/why-is-0xf-equal-to-0xfffffff0-on-a-32-bit-machine#:~:text=That%20means%200xF%20is%20actually,0%20in%20the%20binary%20representation.

 

15.9 구조체 안의 비트 필드

비트가 연속적으로 나타나있는 형태를 비트 필드라고 한다. 

C에서는 비트필드를 구현하기 위해 구조체를 사용한다. 

15.10 비트필드의 사용방법

이하의 예시와 같은 형태로 비트필드를 사용할 수 있다.

참고로 비트필드에는 scanf로 사용자 입력을 받아 올 수 없다. 
-왜냐하면 비트필드는 비트단위로 메모리를사용한다. 그런데 주소의 최소 단위는 바이트 라서 scanf가 넘겨받지 못하기때문.

15.11 비트필드의 패딩

비트필드에서도 패딩이 발생한다. 

 

 

댓글