c++ int를 bytes로 쪼개고, bytes를 int로 합치기

낭만개발자·2021년 9월 17일
0

c++

목록 보기
1/1

1. int 숫자를 byte 로

2. byte를 int로 합치기 (비트계산)

#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는 문자로 받으니 연산이 가능한가 보다.

profile
낭만닥터와 슬의를 보고 저런 개발자가 되어야 겠다고 꿈꿔봅니다.

0개의 댓글