{참고자료}
Endian
bit order
LSB/MSB
비트연산자
비트 마스크
비트 마스킹
컴퓨터는 모든 데이터를 2진수로 처리
data 최소 단위
2진수값인 '0', '1' 두 값 중 하나로 저장
문자 표현이 가능한 최소 단위
8bits = 1 byte
0x00 ~ 0xFF
0b00000000~0b11111111
10진수 (data)
2진수는 0b(data)
8진수는 0(data)
16진수는 0x(data)
int a = 100; // 10진수로 표현한 100
int b = 0b01100100; // 2진수로 표현한 100
int c = 0144; // 8진수로 표현한 100
int d = 0x64; // 16진수로 표현한 100
Most Significant bit
최상위 비트
signed / unsigned data 따라 정보가 달라짐
Least Significant bit
최하위 비트
데이터의 홀짝 / 난수발생 함수, 해시 함수, checksum 확인
2진수의 최상위 최하위 bit를 파악
하나의 데이터에서 처음과 끝 및 방향 파악
MBS < ---- LSB
serial 통신시
송수신의 방향 유의
컴퓨터 메모리에 바이트가 저장 되는 순서
낮은 주소에 MSB 부터 저장
32bit 0x12345678
byte로 저장시 0x12 0x34 0x56 0x78 로 저장
낮은 주소에 LSB 부터 저장
32bit 0x12345678
byte로 저장시 0x78 0x56 0x34 0x12 로 저장
대부분의 인텔 CPU 계열에서 사용
byte order 저장 방식을 읽는 것
메모리에는 Little Endian로 저장
하지만 읽어올때는 사람이 읽는 방향과 같다
memcyp시 packet 값을 낮은 주소에 LSB로 저장
0x3DB 값의 4 bytes packet DB 03 00 00
data 가공시 유의 필요
> 1byte씩 처리 또는 bit operation으로 가공
읽어 오는 packet 크기에 따라 data 값이 변경됨
packet 값 32bits
00 00 AA AA
32bits로 읽어오면
Little endian 0xAAAA0000
Big endian 0x0000AAAA
하지만 16bit로 뒤에만 읽어오면
둘다 0xAAAA로 같다
packet 값 16 bits
12 34
16bits로 읽어오면
Little endian 0x3412
Big endian 0x1234
Packet에 보이는 data 그대로 값이 아니라 OS rule에 따라 packet 값이 다를게 확인 될 수 있음
구현시 주의 할 것.
비트 연산자 [C++/C 기반]
연산자 | 연산기능 |
---|---|
& | 비트 단위 AND연산 |
| | 비트 단위 OR연산 |
^ | 비트 단위 XOR연산 |
~ | 단항 연산자 모든 피연사자 비트 반전 |
두 개의 비트가 서로 다른 경우에 1을 반환
연산 | 결과 |
---|---|
0 ^ 0 | 0 |
0 ^ 1 | 1 |
1 ^ 0 | 1 |
1 ^ 1 | 0 |
0에서 1로, 1에서 0으로 반전시키는 NOT 연산/ 보수연산
signed의 경우 MSB가 반전되어 부호가 바뀜 주의
int num1 = 15; //00000000 00000000 00000000 00001111
int num2 = ~num1; // 11111111 11111111 11111111 11110000
비트를 왼쪽으로 이동 남은 자리는 0으로 채움
A * 2^B 연산과 동일
A << B
A의 비트 열을 B칸씩 왼쪽으로 이동
범위값을 넘어가면 값이 사라짐 주의
uint8_t num = 3; //0000 0011
uint8_t shift num = num << 4; // 0011 0000
비트를 오른쪽으로 이동 남은 자리는 0으로 채움
A / 2^B 연산과 동일
A >> B
A의 비트 열을 B칸씩 오른쪽으로 이동
범위값을 넘어가면 값이 사라짐 주의
uint8_t num = 7; //0000 0111
uint8_t shift num = num >> 2; // 0000 0001
Shift 연산은 범위값에 아주 유의 하여야한다
비트를 바스킹 하는 기법
int num = 0 //00000000 00000000 00000000 00000000
int num = -1 //11111111 11111111 111111111
특정 비트 삭제
특정위치만 0 나머지 1 후 and 연산 해주기
특정 비트만 포함 시키기
특정 위치만 1 나머지 0 후 or 연산 해주기
특정 비트 포함 여부 확인
해당 위치만 1 나머지 0 후 and 연산 해주기
특정 비트 토글
해당 위치만 1하여 XOR 연산 수행하기
토글
하나의 설정 값으로부터 다른 값으로 전환
1>0, 0>1
마지막 비트 구하기
보수 체계 이용
num과 -num의 and 연산 수행
마지막 비트 삭제 하기
보수 체계 이용
num과 num-1의 and 연산 수행
자료형 [C++/C 기반]
크기가 표시된 정수 자료형을 사용하면 bit 계산시 유용하다
data를 원하는 만큼만 잘라서 사용하기 용이
int main( void )
{
int8_t a;
int16_t b;
int32_t c;
int64_t d;
uint8_t e;
uint16_t f;
uint32_t g;
uint64_t h;
}
Signed / unsigned 의 차이로 음수를 적용하는 지 파악
> unsigned의 경우 2의 보수 이용이 안된다.
bool은 실제로 1bit지만 1byte만큼 차지 한다
data 값이 U를 붙이면 unsigned인 값이 된다
uint8_t a = 10U;
unsigned long a = 0UL;
0 // normal number is interpreted as int
0L // ending with 'L' makes it a long
0LL // ending with 'LL' makes it long long
0UL // unsigned long
0.0 // decimal point makes it a double
0.0f // 'f' makes it a float