C언어] 10진수 2진수 진법 변환, 이진수 출력 함수: Decimal to Binary (base-2)


C언어 자체에는 십진수를 이진수로 변환하는 함수가 없기에, 비트 연산으로 직접 만들어야 합니다. 다음은 10/16진수 숫자를 2진수 문자열로, 2진수 문자열을 10/16진수 정수로 만드는 함수입니다. 32비트 정수용입니다.

프로그래밍에서 2진수를 직접 다루어야 하는 경우는 드물고, 대부분 10진수나 16진수를 사용합니다. 따라서 "00100110000110000100111000001110" 이런 2진수는 숫자가 아닌 그냥 평범한 문자열로서만 인식됩니다.

Binary 가 2진수이고, Decimal 이 10진수입니다.

10진수/16진수 <-> 2진수 변환 출력 예제


파일명: 0.cpp
#include <stdio.h>


char *intToBinary(int i);           // 부호 있는 32비트 정수를, 2진수 문자열로 변환
char *uintToBinary(unsigned int i); // 부호 없는 32비트 정수를, 2진수 문자열로 변환

int binaryToInt(char *s);           // 2진수 문자열을, 부호 있는 32비트 정수로 변환
unsigned int binaryToUint(char *s); // 2진수 문자열을, 부호 없는 32비트 정수로 변환


void main(void) {
  puts("\n\nDecimal to Binary (int) :\n");

  printf("%s\n",  intToBinary(0x0));
  printf("%s\n",  intToBinary(0xFF));
  printf("%s\n",  intToBinary(0xFFFF));
  printf("%s\n",  intToBinary(-2147483647 - 1)); // int 최소값 = -2147483648
  printf("%s\n",  intToBinary(2147483647));      // int 최대값
  printf("%s\n",  intToBinary(639127054));       // 임의의 값


  puts("\n\nDecimal to Binary (unsigned int) :\n");

  printf("%s\n", uintToBinary(0x0));
  printf("%s\n", uintToBinary(0xF));
  printf("%s\n", uintToBinary(0xFF));
  printf("%s\n", uintToBinary(0xFFFF));
  printf("%s\n", uintToBinary(0xFFFFFFFF)); // unsigned int 최대값


  puts("\n\nBinary to Decimal (int):");

  printf("%d\n", binaryToInt("0"));
  printf("%d\n", binaryToInt("1111"));
  printf("%d\n", binaryToInt("11111111"));
  printf("%d\n", binaryToInt("1111111111111111"));
  printf("%d\n", binaryToInt("00000000000000001111111111111111"));
  printf("%d\n", binaryToInt("01111111111111111111111111111111"));


  puts("\n\nBinary to Decimal (unsigned int):");

  printf("%u\n", binaryToUint("0"));
  printf("%u\n", binaryToUint("1111"));
  printf("%u\n", binaryToUint("11111111"));
  printf("%u\n", binaryToUint("1111111111111111"));
  printf("%u\n", binaryToUint("00000000000000001111111111111111"));
  printf("%u\n", binaryToUint("11111111111111111111111111111111"));
  printf("%u\n", binaryToUint("00100110000110000100111000001110"));

}




char *intToBinary(int i) {
  static char s[32 + 1] = { '0', };
  int count = 32;

  do { s[--count] = '0' + (char) (i & 1);
       i = i >> 1;
  } while (count);

  return s;
}


char *uintToBinary(unsigned int i) {
  static char s[32 + 1] = { '0', };
  int count = 32;

  do { s[--count] = '0' + (char) (i & 1);
       i = i >> 1;
  } while (count);

  return s;
}



int binaryToInt(char *s) {
  int i = 0;
  int count = 0;

  while (s[count])
    i = (i << 1) | (s[count++] - '0');

  return i;
}


unsigned int binaryToUint(char *s) {
  unsigned int i = 0;
  int count = 0;

  while (s[count])
    i = (i << 1) | (s[count++] - '0');

  return i;
}



실행 결과:
D:\Z>cl 0.cpp && 0.exe
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86
Copyright (C) Microsoft Corporation 1984-2002. All rights reserved.

0.cpp
Microsoft (R) Incremental Linker Version 7.10.3077
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:0.exe
0.obj


Decimal to Binary (int) :

00000000000000000000000000000000
00000000000000000000000011111111
00000000000000001111111111111111
10000000000000000000000000000000
01111111111111111111111111111111
00100110000110000100111000001110


Decimal to Binary (unsigned int) :

00000000000000000000000000000000
00000000000000000000000000001111
00000000000000000000000011111111
00000000000000001111111111111111
11111111111111111111111111111111


Binary to Decimal (int):
0
15
255
65535
65535
2147483647


Binary to Decimal (unsigned int):
0
15
255
65535
65535
4294967295
639127054

D:\Z>



printf("%s\n", intToBinary(-2147483648));

int 최소값인 -2147483648 을 직접 지정하면, warning C4146: unary minus operator applied to unsigned type, result still unsigned (부호 없는 정수형에, 마이너스 부호를 지정했다) 라는 경고가 나오기에,

printf("%s\n", intToBinary(-2147483647 - 1));
이런 식으로 표현했습니다.




intToBinary() 함수에서

static char s[32 + 1] = { '0', };

이것을 static 으로 하지 않으면, warning C4172: returning address of local variable or temporary 이런 워닝이 납니다. 지역 변수의 주소를 반환하려고 했다는 경고입니다. 지역 변수는 그 함수가 종료되면 자동으로 사라지기에 기껏 주소를 반환해도 "주막 없는 번지"가 되어 버립니다. static 변수로 만들면, 함수가 종료되어도 변수가 사라지지 않게 됩니다.

댓글

Designed by JB FACTORY