Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++에서 십진 소수를 이진수로 변환하는 방법


이번 튜토리얼에서는 십진 소수(decimal fraction)를 이진수(binary number)로 변환하는 C++ 프로그램을 살펴보겠습니다.

프로그램에는 하나의 십진 소수와 정수 'k'가 입력으로 주어집니다. 우리의 목표는 주어진 십진 소수를 소수점 이하 'k'자리의 정밀도까지 이진수로 변환하는 것입니다.

변환 알고리즘의 핵심 원리

1. 정수부 변환

정수부를 2로 계속 나누면서 나머지를 차례대로 기록한 후, 문자열을 뒤집으면 해당 정수의 이진 표현이 완성됩니다.

2. 소수부 변환

소수부에 2를 곱한 뒤 그 정수 부분을 확인합니다. 정수부가 1이면 '1', 0이면 '0'을 결과에 추가하고, 1이었다면 1을 빼서 다시 소수부만 남깁니다. 이 과정을 'k'번 반복하면 원하는 자릿수까지의 이진수를 얻을 수 있습니다.

C++ 코드 예제

#include<bits/stdc++.h>
using namespace std;
// 십진수를 이진수로 변환하는 함수
string convert_tobinary(double num, int k_prec) {
   string binary = "";
   // 정수부 추출
   int Integral = num;
   // 소수부 추출
   double fractional = num - Integral;
   // 정수부를 이진수로 변환
   while (Integral) {
      int rem = Integral % 2;
      binary.push_back(rem +'0');
      Integral /= 2;
   }
   // 올바른 이진수 형태를 만들기 위해 문자열 뒤집기
   reverse(binary.begin(),binary.end());
   binary.push_back('.');
   // 소수부를 이진수로 변환
   while (k_prec--) {
      fractional *= 2;
      int fract_bit = fractional;
      if (fract_bit == 1) {
         fractional -= fract_bit;
         binary.push_back(1 + '0');
      } else
      binary.push_back(0 + '0');
   }
   return binary;
}
int main() {
   double n = 4.47;
   int k = 3;
   cout << convert_tobinary(n, k) << " ";
   n = 6.986 , k = 5;
   cout << convert_tobinary(n, k);
   return 0;
}

출력 결과

100.011
110.11111

실행 결과를 보면 4.47은 소수점 이하 3자리까지 100.011로, 6.986은 소수점 이하 5자리까지 110.11111로 변환된 것을 확인할 수 있습니다. 이처럼 정수부와 소수부를 각각 다른 방식으로 처리하면 임의의 정밀도를 가지는 십진 소수를 손쉽게 이진수로 표현할 수 있습니다.