본문 바로가기

프로그래밍 기초

비트연산자와 Byte

임베디드 관련 코드들을 보면 데이터를 다루는 부분에서는 거의 항상 빠지지 않고 등장하는 것이 비트 연산자이다. 

아직도 볼때마다 익숙치않아서 코드를 해석하는 것이 힘들때가 많다.


특히 Byte변수를 다룰 때 많이 등장하는데 데이터를 전송하고 프로토콜에 따라 패킷을 만드는 부분에서 많이 사용하는 것 같다.


주로 사용하는 비트 연산자에는 AND, OR, XOR, NOT 있는데 코드 상에는 순서대로 &, |,  ^, ~ 으로 사용된다.


각 비트연산자의 뜻은 아래와 같다


AND(&)


비교하는 두 비트의 값이 모두 1이면 1, 0이면 0


0111 1000(120)
0001 1010(26)
_________ &
0001 1000(24)

필요한 경우:

1. 특정 비트만 0으로 만들고 싶을 때

2. 특정 비트만 확인하고 싶을 때 (masking)

3. 특정 변수가 홀수인지 짝수인지 알고 싶을 때


OR(|)


비교하는 두 비트의 값이 하나라도 1이면 1, 아니면 0


0000 0100(4)
0000 0010(2)
_________ |
0000 0110(6)

필요한 경우:

1. 특정비트만 1로 만들고 싶을 때


XOR(^)


비교하는 두 비트의 값이 모두 다를 때만 1, 아니면 0


0000 0100(4)
0000 0011(3)
_________ ^
0000 0111(7)

필요한 경우:

1.특정 비트를 토글하고 싶을 때



NOT(~)


비트값이 1이면 0, 0이면 1로 설정


부록 


시프트 연산자(<< , >>)


각 비트를 왼쪽, 오른쪽으로 이동시킨다. 

주의할 점은 unsigned 속성과 signed 속성은 왼쪽 시프트로 이동시킬 때 부호비트로 인해 결과값이 달라질 수 있으므로 사용시 주의하여야 한다.


필요한 경우:

1. 2개 이상의 1byte(8bit) 정수를 합쳐서 int형 변수에 넣어줄 때

byte[] data = {0b00000101, 0b00000001};

int temp = (data[0]<<8)|data[1];

temp = 00000101 00000001;


2. 나누기나 곱셉대신 사용할 때(단 2의 지수승과 정수형일 때만 사용가능)


 시프트 연산자

  같은 연산

 << 1

 *2

 << 2

 *4

 << 3

 *8

 << 4

 *16

 >> 1

 /2

 >> 2

 /4

 >> 3

 /8

 >> 4

 /16


int temp = 2;


곱하기

temp = temp <<1;

결과 값은 temp = 4


나누기

temp =  temp >>1;

결과 값은 temp = 1