1. 2진수를 정수 데이터로 저장

1.1 10진법 정수 → 2진법 정수

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
// 10진법 정수를 입력받는다
int dec;
std::cin >> dec;

int bin = 0;
int powerOfTen = 1;

// 10진법 정수를 2진법 정수로 변환하여 bin에 저장
while (dec > 0)
{
	bin += (dec % 2) * powerOfTen;
	powerOfTen *= 10;
	dec /= 2;
}

// 입력받았던 정수를 2진법 정수로 출력
std::cout << bin << std::endl;

1.2 2진법 정수 → 10진법 정수

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
// 2진법 정수를 입력받는다
int bin;
std::cin >> bin;

int dec = 0;
int powerOfTwo = 1;

// 2진법 정수를 10진법 정수로 변환하여 dec에 저장
while (bin > 0)
{
	dec += (bin % 10) * powerOfTwo;
	powerOfTwo *= 2;
	bin /= 10;
}

// 입력받았던 정수를 10진법 정수로 출력
std::cout << dec << std::endl;

2. 2진수를 bitset에 저장

2.1 bistset이란?

  • <bitset> 헤더에 선언 존재
  • 고정된 크기의 비트열을 추상화한 자료구조
  • 비트 한 개를 1 bit에 저장 → bool은 1 byte 크기이므로 bool 타입의 컨테이너나 배열을 사용하는 것보다 효율적이다
  • 템플릿 매개 변수로 비트열의 크기를 정한다

2.2 10진법 정수 → 2진법 bitset

1
2
3
4
5
6
7
8
9
// 10진법 정수를 입력받는다
int dec;
std::cin >> dec;

// 입력받은 정수를 생성자의 인자로 받으면서 크기가 10인 bitset을 만든다
std::bitset<10> bits(dec);

// 입력받은 정수를 2진법으로 출력
std::cout << bits << std::endl;
  • bitset을 출력할 때는 bitset의 크기만큼 자릿수를 채워서 출력한다

2.3 2진법 bitset → 10진법 정수

1
2
3
4
5
6
7
8
9
// 2진수를 string 타입 문자열로 입력받는다
std::string bin;
std::cin >> bin;

// 입력받은 문자열을 생성자의 인자로 넘기면서 크기가 10인 bitset을 만든다
std::bitset<10> bits(bin);

// unsigned long 타입의 10진수 정수 형태로 바꿔서 출력한다
std::cout << bits.to_ulong() << std::endl;
  • 만약 2진수가 음수(2의 보수)로 들어온다면 아래와 같이 처리해야 한다
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
// 음수인 2진수를 string 타입 문자로 입력받는다
std::string bin;
std::cin >> bin;

// 입력받은 문자열을 생성자의 인자로 넘기면서 크기가 10인 bitset을 만든다
std::bitset<10> bits(bin);

// 모든 비트를 뒤집는다 -> 1의 보수
bits.flip();

// 1의 보수를 unsigned long 타입 정수로 바꾼후 1을 더한다 -> 2의 보수
// unsigned long은 음수가 될 수 없으므로 int로 형변환 후 -1을 곱한다
std::cout << -(static_cast<int>(bits.to_ulong()) + 1) << std::endl;
  • bitset을 바로 음수로 표현할 수는 없어서 양의 정수로 바꾼 후 -1을 곱한다