C에서 이진수를 십진수로 변환

Muhammad Hashim Safder 2024년2월15일
  1. C에서 이진수를 십진수로 변환
  2. 방법 1: 루프 및 정수 변수를 사용하여 변환
  3. 방법 2: 절차적 접근 방식 사용
  4. 방법 3: char 배열을 사용하여 이진수 저장
C에서 이진수를 십진수로 변환

이 문서에서는 이진수를 10진수로 변환하는 여러 C 구현에 대해 포괄적으로 설명합니다. 그러나 구현에 뛰어들기 전에 불가피한 변환 기반을 찾아야 합니다.

C에서 이진수를 십진수로 변환

이진수는 0과 1의 두 값만 포함할 수 있습니다. 그러나 십진수 표기법에는 0에서 9까지(0,1,2,3,4,5,6,7,8,9)의 10개 기호가 있습니다.

이진수(0,1) 표기법은 컴퓨터 하드웨어 고유의 표기법이며 십진수 값은 사람이 쉽게 이해할 수 있는 정수 값입니다.

변환 방법

이진수 0101은 십진수 5에 해당합니다. 2진법에서 10진법으로의 변환 방법은 다음 공식에 설명된 것처럼 매우 간단합니다.

<사업부>
$$
DecimalEquivalent =\sum_{i=0}^{n-1}\left(B_{i} \times 2^{i}\right)
$$

여기서 B는 전체 이진수이고 B_{i}는 주어진 이진수에서 i^th^ 비트를 나타냅니다. n은 주어진 이진수의 총 비트 수를 나타냅니다.

위 수식을 이진수 0101에 적용해 보겠습니다. 왼쪽에서 오른쪽으로 합산하면 다음을 얻습니다.

<사업부>
$$
DecimalEquivalent \ of\ (0101)_{2} = 0×2^3 + 1×2^2 + 0×2^1 + 1×2^0 \
= 0 + 4 + 0 + 1 \
= 5
$$

이진 언어는 전자 회로에 신호와 논리 게이트가 있기 때문에 하드웨어 측면에서 사용됩니다. 시스템에서 쉽게 이해할 수 있습니다. 모든 단일 이진수 0 또는 1은 1비트로 알려져 있습니다.

이진수를 10진수로 변환하는 알고리즘

이 변환 문제를 해결하기 위한 단계별 절차를 살펴보겠습니다.

  1. 프로그램을 시작합니다.
  2. 이진수를 입력으로 사용합니다.
  3. 숫자가 0보다 크면 숫자를 10으로 나누고 나머지를 2*i로 곱합니다. 여기서 i는 0부터 시작합니다.
  4. 3단계에서 설명한 대로 몫을 계속 나누고 각 반복에서 i를 1씩 증가시킵니다.
  5. 모든 제품을 합산하고 결과를 반환합니다.

문제를 해결하기 위한 여러 가지 구현 옵션이 있습니다. 이러한 접근 방식에 대해 하나씩 논의해 보겠습니다.

방법 1: 루프 및 정수 변수를 사용하여 변환

forwhile 루프는 이진수를 십진수로 변환할 수 있습니다.

while 루프 사용

이 접근 방식에서 나눗셈 연산은 이진수를 십진수로 변환합니다.

#include <math.h>
#include <stdio.h>
int main() {
  int binary_number;
  printf("Enter Binary number: ");
  scanf("%d", &binary_number);
  int decimal = 0, temp = 0, reminder;
  while (binary_number != 0) {
    reminder = binary_number % 2;
    binary_number = binary_number / 10;
    decimal = decimal + reminder * (int)pow(2, temp);
    temp++;
  }
  printf("Decimal number is : %d", decimal);
  return 0;
}

main()의 첫 번째 줄은 바이너리 입력을 받을 binary_number라는 변수를 선언합니다. 이진수에 대한 입력을 받은 후 세 가지 변수를 추가로 선언합니다.

  1. decimal: 결과 십진수 값을 저장합니다.
  2. temp: 반복 카운터 역할을 합니다.
  3. 나머지: 각 반복에서 나머지를 저장합니다.

while 루프 반복에서 우리는 먼저 binary_number에서 가장 오른쪽 비트를 결정하고 remainder 변수에 저장합니다.

그런 다음 binary_number를 10으로 나누고 그 결과를 자신에게 덮어씁니다. 이로 인해 binary_number가 가장 오른쪽 비트를 잃게 됩니다.

또한 이 기사의 시작 부분에서 논의한 바와 같이 공식을 적용하여 decimal 변수의 가중 곱을 집계합니다. 결국 결과로 나온 10진수를 인쇄합니다.

출력을 살펴보겠습니다.

While 루프

for 루프 사용

두 루프(forwhile)의 기본 구조는 비슷합니다. for 루프를 사용하는 이점은 변수를 한 줄로 간단하게 선언하고 초기화할 수 있다는 것입니다.

다음은 for 루프를 사용하여 이진수를 십진수 값으로 변환하는 또 다른 프로그램입니다.

#include <stdio.h>
int main() {
  int binary, decimal = 0, base = 1, remainder, temp;
  printf("Enter binary number: ");
  scanf("%d", &binary);
  for (temp = binary; temp > 0; temp = temp / 10) {
    remainder = temp % 2;
    decimal = decimal + remainder * base;
    base = base * 2;
  }
  printf("Decimal number is:%d", decimal);
  return 0;
}

for 루프 구현에서는 while 루프와 약간 다른 접근 방식을 사용했습니다.

비용이 많이 드는 pow() 함수를 사용하는 대신 각 반복에서 2 값을 곱하는 base 변수를 만들었습니다. 이렇게 하면 i^th^ 반복 시작 시 base 변수가 2^i^에 해당하는 값을 갖게 됩니다. 여기서 i는 0부터 시작합니다.

출력:

For 루프

방법 2: 절차적 접근 방식 사용

이 방법은 사용자 정의 절차 또는 함수를 사용하여 변환 문제를 해결합니다. 이 접근 방식은 코드를 보다 재사용 가능하고 모듈화하려는 경우 가장 바람직합니다.

#include <math.h>
#include <stdio.h>
int binarytodecimal(int binary_number) {
  int decimal = 0, temp = 0, remainder;
  while (binary_number != 0) {
    remainder = binary_number % 2;
    decimal = decimal + (remainder * pow(2, temp));
    binary_number = binary_number / 10;
    temp++;
  }
  return decimal;
}

int main() {
  int binary_number, decimal;
  printf("Enter binary number: ");
  scanf("%d", &binary_number);
  decimal = binarytodecimal(binary_number);

  printf("Decimal Number is: %d", decimal);
  return 0;
}

전체 변환 코드를 binarytodecimal()이라는 단일 프로시저로 묶었다는 점을 제외하면 모든 것이 이전 방법과 동일합니다.

절차적 방법에 대한 출력

방법 3: char 배열을 사용하여 이진수 저장

이전에 논의된 모든 방법에서 주요 문제는 정수의 크기입니다. 정수 인코딩으로 이진수를 저장하고 있었습니다.

따라서 16비트 컴파일러의 경우 제공할 수 있는 가장 큰 숫자는 111111입니다.

정수 크기가 더 큰 32비트64비트 컴파일러는 확실히 입력 범위를 늘리고 문제를 해결할 것입니다. 그러나이 문제는 이전 버전에서 우리를 놀라게 할 것입니다.

다행스럽게도 문제를 해결하기 위한 핵이 있습니다. 즉, 동적 char 배열을 사용하여 정수 변수 대신 이진수를 저장합니다. 전략을 이해하기 위해 다음 코드를 살펴보겠습니다.

#include <conio.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
  long decimal = 0;
  int size;
  printf("\nEnter maximum number of digits in your Binary number: ");
  scanf("%d", &size);

  char* BinaryArr = (char*)malloc(size + 1);

  printf("Please Enter your Binary Number: ");
  scanf("%s", BinaryArr);

  char ch;
  for (int i = size - 1, j = 0; i >= 0; i--, j++) {
    ch = BinaryArr[i];
    decimal += atoi(&ch) * (int)pow(2, j);
  }

  printf("The equivalent decimal number is: %d", decimal);
  return 0;
}

먼저 사용자에게 동등한 10진수로 변환하려는 이진수의 크기를 확인하도록 요청합니다.

이진수의 크기를 알고 있는 경우 malloc() 함수를 사용하여 해당 크기의 배열을 동적으로 할당합니다. malloc()stdlib.h에 정의되어 있으며 동적 메모리를 바이트 단위로 할당합니다.

문자 배열로 만들기 위해 malloc()의 반환 포인터를 char* 유형으로 명시적으로 유형 변환했습니다.

참고: malloc(size +1)의 추가 1은 끝에 \0 문자를 저장할 공간이 필요하기 때문입니다.

다음으로 문자 포인터 BinaryArr가 가리키는 문자 배열의 입력으로 이진수를 사용합니다.

그런 다음 마지막 인덱스(즉, 이진수의 최하위 비트)에서 이 문자 배열을 반복하기 시작하고 각 반복 후 인덱스 0에 가까워지는 이진 문자를 하나씩 가져옵니다.

각 반복에서 i^th^ 인덱스를 보조 ch 변수에 저장합니다. 그런 다음 atoi() 함수를 적용하여 동등한 정수 값을 얻습니다.

그런 다음 이 기사의 시작 부분에서 논의한 공식에 모든 것을 넣습니다.

마지막으로 루프가 종료되자마자 최종 10진수 값을 인쇄합니다. 출력 콘솔에서 어떻게 느껴지는지 봅시다.

배열 메서드의 출력

관련 문장 - C Binary