C언어/ 10진->2진 변환 알고리즘을 작성하였습니다.

abrahan의 이미지

좀더 최적한 방법은 없을까요

#include <stdio.h>
#include <stdlib.h>
int main(void) {
	int val, val2;
	int i, j;
	int change[32], imsi[32]; //int가 32비트이므로
	printf("10진 정수 입력 : ");
	scanf_s("%d", &val);
	if (val >= 0) { //양수 입력시
		for (i = 0; i < 32; i++) {
			val2 = val % 2; //10진->2진 변환 공식
			val = val / 2;
			change[i] = val2;
			imsi[31 - i] = change[i]; //값이 반대로 입력 됐으므로 값 뒤집기
		}
		//값 출력
		for (i = 0; i < 32; i++) {
			if (i % 4 == 0 && i!=0) { //4자리씩 깔끔하게 끊기
				printf(" ");
			}
			printf("%d", imsi[i]);
		}
	}
	else if (val < 0) { //음수 입력시
		for (i = 0; i < 32; i++) {
			val2 = val % 2;
			val = val / 2;
			change[i] = val2;
			imsi[31 - i] = !change[i]; //1의 보수를 취함
		}
		//1을 더하는 과정중 이는 10진수로 표현이 되므로 이러한 과정을 거침
		for (j = 0; j < 32; j++) {
			if (imsi[31 - j] == 0) { // 끝자리가 0이면 그냥 1을 더하고 루프 탈출
				imsi[31-j] += 1;
				j = 33;
			}
			else if(imsi[31-j]==1) { // 끝자리가 1이면 0으로바꿈
				imsi[31 - j] = 0;
			}
		}
		//값 출력
		for (i = 0; i < 32; i++) {
			if (i % 4 == 0 && i != 0) { //4자리씩 깔끔하게 끊기
				printf(" ");
			}
			printf("%d", imsi[i]);
		}
 
	}
	system("PAUSE");
	return 0;
}
라스코니의 이미지

음... 10진수에서 2진수로 변환하는 것은 이미 작성하신 코드와 같습니다. 하지만 일일히 나누어서 구하는 것은 너무 비싼 함수겠죠?
사실 최적화라는 것은 좀 엉뚱한 방법이 많습니다. 이미 컴퓨터는 10진수, 16진수를 모릅니다. 무조건 2진수죠. 이미 메모리에는 이진수로 저장되어 있습니다. 따라서 그것을 int change[32] 배열에 넣는 것은 아래와 같이 합니다.

#define EJIN_0 (0x1 << 0)
#define EJIN_1 (0x1 << 1)
#define EJIN_2 (0x1 << 2)
...

change[0] = (((val & EJIN_0) != 0) ? 1 : 0);
change[1] = (((val & EJIN_1) != 0) ? 1 : 0);

등으로 할 수 있습니다. 보시면 규칙이 있기 때문에 for() 루프로도 돌릴 수 있고요.
방법은 이미 메모리에 2진수로 저장되어 있는 val에 각 비트마다 마스크(mask)와 AND 연산을 해서 그 값을 알아내는 것입니다.

parkon의 이미지

최적화라기 보다는,
그냥 변수 val을 int가 아닌 unsigned로 해서 코드 중복을 좀 줄여,
결과적으로 코드를 좀 더 짧게 바꿔 봤습니다.

#include <stdio.h>
#include <stdlib.h>
int main(void) {
   unsigned val;
   int i;
   int imsi[32]; //int가 32비트이므로
   printf("10진 정수 입력 : ");
   scanf("%d", &val);
   for (i = 31; i >= 0; i--, val /= 2) {
      imsi[i] = val % 2; //값이 반대로 입력 됐으므로 값 뒤집기
   }
   //값 출력
   for (i = 0; i < 32; i++) {
      if (i % 4 == 0 && i != 0) { //4자리씩 깔끔하게 끊기
         printf(" ");
      }
      printf("%d", imsi[i]);
   }
   //system("PAUSE");
   printf("\n");
   return 0;
}