1. 2진수를 정수 데이터로 저장
1.1 10진법 정수 → 2진법 정수
// 10진법 정수를 입력받는다
int dec;
std::cin >> dec;
int bin = 0;
int powerOfTen = 1;
// 10진법 정수를 2진법 정수로 변환하여 bin에 저장
for (int i = 0; dec > 0; ++i)
{
bin += (dec % 2) * powerOfTen;
powerOfTen *= 10;
dec /= 2;
}
// 입력받았던 정수를 2진법 정수로 출력
std::cout << bin << std::endl;
C++
복사
1.2 2진법 정수 → 10진법 정수
// 2진법 정수를 입력받는다
int bin;
std::cin >> bin;
int dec = 0;
int powerOfTwo = 1;
// 2진법 정수를 10진법 정수로 변환하여 dec에 저장
for (int i = 0; bin > 0; ++i)
{
dec += (bin % 10) * powerOfTwo;
powerOfTwo *= 2;
bin /= 10;
}
// 입력받았던 정수를 10진법 정수로 출력
std::cout << dec << std::endl;
C++
복사
2. 2진수를 bitset에 저장
2.1 bistset이란?
•
<bitset> 헤더에 선언 존재
•
고정된 크기의 비트열을 추상화한 자료구조
•
비트 한 개를 1 bit에 저장 → bool은 1 byte 크기이므로 bool 타입의 컨테이너나 배열을 사용하는 것보다 효율적이다
•
템플릿 매개 변수로 비트열의 크기를 정한다
2.2 10진법 정수 → 2진법 bitset
// 10진법 정수를 입력받는다
int dec;
std::cin >> dec;
// 입력받은 정수를 생성자의 인자로 받으면서 크기가 10인 bitset을 만든다
std::bitset<10> bits(dec);
// 입력받은 정수를 2진법으로 출력
std::cout << bits << std::endl;
C++
복사
•
bitset을 출력할 때는 bitset의 크기만큼 자릿수를 채워서 출력한다
2.3 2진법 bitset → 10진법 정수
// 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;
C++
복사
•
만약 2진수가 음수(2의 보수)로 들어온다면 아래와 같이 처리해야 한다
// 음수인 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;
C++
복사
•
bitset을 바로 음수로 표현할 수는 없어서 양의 정수로 바꾼 후 -1을 곱한다