이진 언어는 전자 회로에 신호와 논리 게이트가 있기 때문에 하드웨어 측면에서 사용됩니다. 시스템에서 쉽게 이해할 수 있습니다. 모든 단일 이진수 0 또는 1은 1비트로 알려져 있습니다.
이진수를 10진수로 변환하는 알고리즘
이 변환 문제를 해결하기 위한 단계별 절차를 살펴보겠습니다.
프로그램을 시작합니다.
이진수를 입력으로 사용합니다.
숫자가 0보다 크면 숫자를 10으로 나누고 나머지를 2*i로 곱합니다. 여기서 i는 0부터 시작합니다.
3단계에서 설명한 대로 몫을 계속 나누고 각 반복에서 i를 1씩 증가시킵니다.
모든 제품을 합산하고 결과를 반환합니다.
문제를 해결하기 위한 여러 가지 구현 옵션이 있습니다. 이러한 접근 방식에 대해 하나씩 논의해 보겠습니다.
방법 1: 루프 및 정수 변수를 사용하여 변환
for 및 while 루프는 이진수를 십진수로 변환할 수 있습니다.
while 루프 사용
이 접근 방식에서 나눗셈 연산은 이진수를 십진수로 변환합니다.
#include<math.h>#include<stdio.h>intmain(){intbinary_number;printf("Enter Binary number: ");scanf("%d",&binary_number);intdecimal=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);return0;}
main()의 첫 번째 줄은 바이너리 입력을 받을 binary_number라는 변수를 선언합니다. 이진수에 대한 입력을 받은 후 세 가지 변수를 추가로 선언합니다.
decimal: 결과 십진수 값을 저장합니다.
temp: 반복 카운터 역할을 합니다.
나머지: 각 반복에서 나머지를 저장합니다.
각 while 루프 반복에서 우리는 먼저 binary_number에서 가장 오른쪽 비트를 결정하고 remainder 변수에 저장합니다.
그런 다음 binary_number를 10으로 나누고 그 결과를 자신에게 덮어씁니다. 이로 인해 binary_number가 가장 오른쪽 비트를 잃게 됩니다.
또한 이 기사의 시작 부분에서 논의한 바와 같이 공식을 적용하여 decimal 변수의 가중 곱을 집계합니다. 결국 결과로 나온 10진수를 인쇄합니다.
출력을 살펴보겠습니다.
for 루프 사용
두 루프(for 및 while)의 기본 구조는 비슷합니다. for 루프를 사용하는 이점은 변수를 한 줄로 간단하게 선언하고 초기화할 수 있다는 것입니다.
다음은 for 루프를 사용하여 이진수를 십진수 값으로 변환하는 또 다른 프로그램입니다.
#include<stdio.h>intmain(){intbinary,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);return0;}
for 루프 구현에서는 while 루프와 약간 다른 접근 방식을 사용했습니다.
비용이 많이 드는 pow() 함수를 사용하는 대신 각 반복에서 2 값을 곱하는 base 변수를 만들었습니다. 이렇게 하면 i^th^ 반복 시작 시 base 변수가 2^i^에 해당하는 값을 갖게 됩니다. 여기서 i는 0부터 시작합니다.
출력:
방법 2: 절차적 접근 방식 사용
이 방법은 사용자 정의 절차 또는 함수를 사용하여 변환 문제를 해결합니다. 이 접근 방식은 코드를 보다 재사용 가능하고 모듈화하려는 경우 가장 바람직합니다.
#include<math.h>#include<stdio.h>intbinarytodecimal(intbinary_number){intdecimal=0,temp=0,remainder;while(binary_number!=0){remainder=binary_number%2;decimal=decimal+(remainder*pow(2,temp));binary_number=binary_number/10;temp++;}returndecimal;}intmain(){intbinary_number,decimal;printf("Enter binary number: ");scanf("%d",&binary_number);decimal=binarytodecimal(binary_number);printf("Decimal Number is: %d",decimal);return0;}
전체 변환 코드를 binarytodecimal()이라는 단일 프로시저로 묶었다는 점을 제외하면 모든 것이 이전 방법과 동일합니다.
방법 3: char 배열을 사용하여 이진수 저장
이전에 논의된 모든 방법에서 주요 문제는 정수의 크기입니다. 정수 인코딩으로 이진수를 저장하고 있었습니다.
따라서 16비트 컴파일러의 경우 제공할 수 있는 가장 큰 숫자는 111111입니다.
정수 크기가 더 큰 32비트 및 64비트 컴파일러는 확실히 입력 범위를 늘리고 문제를 해결할 것입니다. 그러나이 문제는 이전 버전에서 우리를 놀라게 할 것입니다.
다행스럽게도 문제를 해결하기 위한 핵이 있습니다. 즉, 동적 char 배열을 사용하여 정수 변수 대신 이진수를 저장합니다. 전략을 이해하기 위해 다음 코드를 살펴보겠습니다.
#include<conio.h>#include<math.h>#include<stdio.h>#include<stdlib.h>intmain(){longdecimal=0;intsize;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);charch;for(inti=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);return0;}
먼저 사용자에게 동등한 10진수로 변환하려는 이진수의 크기를 확인하도록 요청합니다.
이진수의 크기를 알고 있는 경우 malloc() 함수를 사용하여 해당 크기의 배열을 동적으로 할당합니다. malloc()은 stdlib.h에 정의되어 있으며 동적 메모리를 바이트 단위로 할당합니다.
문자 배열로 만들기 위해 malloc()의 반환 포인터를 char* 유형으로 명시적으로 유형 변환했습니다.
참고: malloc(size +1)의 추가 1은 끝에 \0 문자를 저장할 공간이 필요하기 때문입니다.
다음으로 문자 포인터 BinaryArr가 가리키는 문자 배열의 입력으로 이진수를 사용합니다.
그런 다음 마지막 인덱스(즉, 이진수의 최하위 비트)에서 이 문자 배열을 반복하기 시작하고 각 반복 후 인덱스 0에 가까워지는 이진 문자를 하나씩 가져옵니다.
각 반복에서 i^th^ 인덱스를 보조 ch 변수에 저장합니다. 그런 다음 atoi() 함수를 적용하여 동등한 정수 값을 얻습니다.
그런 다음 이 기사의 시작 부분에서 논의한 공식에 모든 것을 넣습니다.
마지막으로 루프가 종료되자마자 최종 10진수 값을 인쇄합니다. 출력 콘솔에서 어떻게 느껴지는지 봅시다.