c·c++/c 프로그래밍

2진수의 자리이동

바로이순간 2012. 4. 19. 10:26

1.000000010101110100001

 위와 같은 2진수 가 있을경우에

 2의 12승을 곱하면

 

소수점 포인트만 오른쪽으로 12번 이동하게 할수 있나요?

 다음과 같이요

 

1000000010101.110100001

 

이렇게 코딩할수 있는 방법이 있을까요? 도와주세요!!!!!! ㅠㅠ

데이터형은 뭘로 해야할까여?;;


------------------------------------------------------------------------------------------------------------------

내부적으로 정수든 부동소수든 2진법으로 표현되어 있습니다.

하지만 출력을 할때 2진법으로 출력은 직접 지원이 되지 않습니다.


내부적으로는 질문자가 원하는 것이 자동적으로 지원이 되고 있습니다.

하지만 2진법으로 출력을 하는 것이 쉽지 않으니까 위와 같은 질문을

하게 되는 것입니다.


만약 질문자의 의도가 내부적인 표현과 무관하게 - 문자열로 라도 - 

 1.000000010101110100001 

에 2의 12승을 곱해서

1000000010101.01110100001 가 나오게 하면 좋겠다는 뜻이라면


내부적으로 문자열과 소수점의 위치를 모두 자료로 가지고 있으면 됩니다.

처음에 주어진 자료는 문자열

" 1000000010101110100001" 과 소수점의 위치 1을 가지고 있습니다.

소수점의 위치 1은 배열의 [1]번째 문자의 앞에 소수점이 위치한다는 뜻입니다.


따라서 2의 12승을 곱하면 소수점의 위치가 1 ==> 13이 됩니다.

소수점의 위치가 13번째 문자의 앞에 오도록 하면 됩니다.

 


#include <stdio.h>

#include <string.h>

int main() {

  char buf[100];

  char binary[100];

  int  decimal=1;

  int  i, j, x;


  printf("2진수 입력: ");

  gets(buf);

  i=0;

  j=0;

  while(buf[i]) {

    if(buf[i]!='.') binary[j++]=buf[i++];

    else decimal=i++;

  }

  binary[j]=0;


  printf("2의 몇승: ");

  scanf("%d", &x);

  decimal=decimal+x;


  if(decimal<=0) {   // 2의 -12승을 한 경우 : 이런 경우를 처리를 해주어야 한다면

    printf("0.");

    for(i=0;i<-decimal;++i) printf("0");

    printf("%s",binary);  

  }

  else if(decimal<strlen(binary)) {

    for(i=0;i<decimal;++i) printf("%c",binary[i]);

    printf(".");

    printf("%s",(char*)((int)binary+decimal));

  }

  else {

    printf("%s", binary);

    for(i=strlen(binary);i<decimal;++i) printf("0");

    printf(".");  // 이 부분이 꼭 필요한 것인가??? 

  }


  return 0;

}


위의 프로그램으로 하면 돌아갈 것입니다.
위의 프로그램에서는 입력하는 이진수에 소수점이 반드시 있어야 한다.
예를 들어서 101 을 입력할때도 101. 과 같이 주어야만 한다.

위의 프로그램은 몇차례의 수정을 거쳐서 완성되었다.
decimal<=0 과 같은 조건도 처음에는 decimal<0 이었지만, decimal<=0 로 수정되었다.