임베디드 관련 코드들을 보면 데이터를 다루는 부분에서는 거의 항상 빠지지 않고 등장하는 것이 비트 연산자이다.
아직도 볼때마다 익숙치않아서 코드를 해석하는 것이 힘들때가 많다.
특히 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