#include <iostream>
using namespace std;
int main() {
unsigned char lowByte;
unsigned char highByte;
int x = 4002;
lowByte = (x & 255);
highByte = ((x >> 8) & 255);
printf("%d\n", lowByte); // 162
printf("%d\n", highByte); // 15
int result = (highByte << 8) + lowByte;
printf("%d\n", result);// 4002
}
위의 소스에서 int x = 4002를 우선 2 byte로 쪼개 담으려 한다.
담는 방식은 MSB(Big Endian), 큰 바이트, 작은 바이트 순으로 담을 테다.
그래서 4행, 5행을 보자.
4행에 (x & 255); 를 우선 보기 전에 연산자 소개부터 하자면..
- & : 비트 AND 연산자 : 연산할 때 둘다 1이면 1, 하나라도 0이면 0이다.
즉 1100 & 1011 을 연산하면 = 1000 이다.- | : 비트 OR 연산자 : 둘 중 하나라도 1이면 1이다. 당연 둘다 1이면 1, 둘다 0이면 0.
즉 1100 | 1011 을 연산하면 = 1111 이다.- ^ : 비트 XOR 연산자 : 둘 다 다를경우 1이다. 같으면 0.
즉 위에것을 연산하면 = 0111 이다.
int 1개를 -> 2 bytes로 변경하려면 & 방법을 쓰는게 좋다.
4행을 보면 x를 2진수로 변경해보면 0000 1111 1010 0010
이다
(int가 c++에선 2byte라 앞에 0000은 안적어도 되지만 보기 편하게 적었다.)
즉 0000 1111 1010 0010 & 1111 1111 = 1010 0010
에서 x의 바이너리 중에 상위 8개 하위 8개로 나눈다면, 연산 후에 & 연산자 왼쪽 값의 상위 비트 8개는 날려버려지고, 하위 8개 비트 값만 그대로 남았다.
즉 255가 1111 1111
이므로 & 255
로 몇바이트 이든 간에 연산을 하면 하위 1byte 값만 남게 해주는 매직 수식인 셈이다.
그래서 우리는 & 255
연산을 통해 하위 1byte(8개의 binary) 값을 분해했고, lowByte 에 넣었다.
그럼 이제 하위 값은 얻었으니 상위 1byte를 얻는 방법은,
5행 ((x >> 8 ) & 255);
수식인데 설명하자면 x의 binary 전체 값을 8칸 오른쪽으로 이동하라(>>) 의미이고,
8자리 오른쪽으로 이동하면 0000 0000 0000 1111 값이 나온다.
(왜냐하면 4002의 값이 0000 1111 1010 0010 이니까 이걸 각 8자리씩 우측으로 옮기고
빈 자리는 0으로 채워넣는다고 생각해보라)
나온 값에서 아까와 같이 매직 수식 & 255
를 해주면 앞에 0으로 채워진 8개 1byte는 날라가고, 0000 1111 만 남게 된다. 이게 상위 1byte이고 우리는 highByte에 넣어주었다
(의미는 없지만 이걸 10진수로 출력하면 15이다, 하위 바이트는 10진수로 출력하면 162)
이렇게 해서 상위,하위 바이트로 분리는 끝났다.
다시 2byte(상,하위 byte)를 합치려면
highByte << 8
(= highByte를 왼쪽으로 8칸 옮겨주면)
상위 byte의 자리 값을 차지하게 하고, 그리고 + 연산자 사용해서 lowbyte(하위 1byte)를 더해 주면
처음의 숫자 4002가 나온다.
여기서 유의할 점은 high, lowByte 자료형을 1행 처럼 char를 안쓰고 byte를 쓰면
& 255
같은 연산을 못해준다. 에러 발생. 아마 byte 자료형은 binary로 값을 가지기 때문에 255는 일단 int 숫자이니 byte랑 int 연산은 불가능한테, char는 문자로 받으니 연산이 가능한가 보다.