[TIL] C++ - 진수 표현 방법

MINO·2024년 11월 25일

BOJ - 쿼드트리 문제를 풀며, 다음과 같은 출력 방법이 필요했다.

쿼드트리를 구현하고, 주어진 출력 조건에 맞게 출력을 하려고 했으나 잘 되지 않았다.
사실 출력 방법의 문제가 아니라, for문을 돌면서 비트 값을 잘못 더해주고 있던 것이 문제였으나
이번 기회에 C++ 의 출력 방식에 대해 더 자세히 알게 되어서 정리해봤다.



1. 10진수 (Decimal)

  • 기본적으로 숫자를 입력하였을 때 해석되는 방식
int decimal = 42;
cout << decimal << '\n'; // 42

2. 2진수 (Binary)

  • 접두사 0b 를 사용하여 2진수를 표현 (C++11 이후 지원)
  • C++ 표준 라이브러리에는 2진수 출력 기능이 없어서 변환 구현 필요
  • <bitset> 라이브러리를 통해 2진수 출력 가능
#include<bitset>

int binaryValue = 0b101010; // 2진수 (10진수 : 42)
cout << binaryValue << '\n'; // 42
cout << bitset<8>(binaryValue) << '\n'; // 00101010

bitset<n>(value) : value 를 n 의 자리의 2진수로 표현


3. 8진수 (Octal)

  • 접두사 0 을 사용하여 8진수를 표현
  • std::oct 를 사용하여 8진수로 출력
int octValue = 052; // 8진수 (10진수 : 42)
cout << octValue << '\n'; // 42
cout << oct << octValue <<'\n'; // 52

4. 16진수 (Hexadecimal)

  • 접두사 0x 를 사용하여 16진수를 표현
  • std::hex 를 사용하여 16진수로 출력
  • std::uppercase 를 사용하여 대문자 출력
int hexValue = 0x2A; // 16진수 (10진수 : 42)
cout << hexValue << '\n'; // 42
cout << hex << hexValue << '\n'; // 2a
cout << uppercase << hex << hexValue << '\n'; // 2A

주의 사항

  • C++ 에서 std:cin 으로 직접 16진수나 8진수를 입력받을 때는 별도의 문자열 파싱을 거쳐주자.
    (기본적으로 10진수로 처리되기 때문)

  • std::showbase 를 사용하여 0x 또는 0 접두사를 표현한 방식으로 출력

int value = 42;
cout << showbase << hex << value << '\n'; // 0x2a
cout << uppercase << hex << value << '\n'; // 0X2A
cout << oct << value << '\n'; // 052

<iomanip> 라이브러리

입출력 포맷 제어를 위해 다양한 기능을 제공하는 라이브러리.

진법 설정

코드용도
std::hex (16진수) , std::oct (8진수) , std::dec (10진수, 기본값)진법 출력
std::showbase숫자의 진법에 따라 접두사 표시
std::noshowbaseshowbase 로 설정된 접두사를 숨기기
std::uppercase16진수 출력 시 알파벳 대문자를 사용
std::nouppercase알파벳 소문자로 출력

출력 폭 및 채우기

코드용도
std::setw(n)숫자를 출력할 최소 너비를 설정
std::setfill(c)std::setw 로 확보한 공간을 특정 문자로 채우기
std::left / std::right출력 정렬 방향을 설정


C++ 로 알고리즘 문제를 풀다가 진법 변환, 출력 형식의 조건을 맞춰줄 때 참고하도록 하자.

profile
안녕하세요 게임 개발하는 MINO 입니다.

0개의 댓글