#include <stdio.h>
#include <math.h>
void gwazemul(unsigned wn) {
if (wn < 2) {
printf("%d", wn);
}
else {
gwazemul(wn / 2);
printf("%d", wn % 2);
}
}
void gwazemul2(unsigned n) {
unsigned a = 0x80000000;
for (int i = 0; i < 32; i++) {
if ((a & n) == a)
printf("1");
else
printf("0");
a >>= 1;
}
}
int main() {
printf(" **************************************************************************\n");
printf(" ** * * * * * * * * **\n");
printf(" ** * * * * ** **\n");
printf(" ** * * * * booth 풀이 프로그램 * * * **\n");
printf(" ** * * * * **\n");
printf(" ** * * * * * * * * **\n");
printf(" ************************************************************************\n\n");
printf("한번이라도 0을 기입하면 나갑니다.\n");
printf("0은 어떤 수를 곱해도 0입니다!\n");
while (1) {
int a, b, i1, i2, a2, b2, b3 = 0;
printf("\n10진수를 입력하시오 : ");
scanf_s("%d", &a);
printf("10진수를 입력하시오 : ");
scanf_s("%d", &a2);
printf("첫번째 입력값의 2진수 변환값 : ");
for (i1 = 15; i1 >= 0; i1--) {
b = 1 << i1;
printf("%d", a & b ? 1 : 0);
if (i1 % 4 == 0)
printf(" "); // 16비트 2진수를 나타내는 함수입니다.
}
printf("(2)\n");
printf("두번째 입력값의 2진수 변환값 : ");
for (i2 = 15; i2 >= 0; i2--) {
b2 = 1 << i2;
printf("%d", a2 & b2 ? 1 : 0);
if (i2 % 4 == 0)
printf(" "); // 16비트 2진수를 나타내는 함수입니다.
}
printf("(2)");
printf("\n\n2번째 10진수의 2진수를 기입해주세요! (16자리)\n");
printf("비트 당 1회 씩 엔터를 총 16번 쳐야하는 번거로움이 있습니다. 양해바랍니다..\n");
int j[17];
int i4 = 0;
//변수와 배열을 선언하는데 배열은 숫자 10개가 입력되므로 그것보다 약간 큰 11로 잡는다.
for (i4 = 1; i4 <= 16; i4++) { // 2의 승수를 비트별로 차례대로 넣는 함수입니다.
printf("%d", i4);
printf("번째 비트 : ");
scanf_s("%d", &j[i4]);
}
printf("\n ");
for (i1 = 15; i1 >= 0; i1--) { // 16비트 2진수를 나타내는 함수입니다.
b = 1 << i1;
printf("%d", a & b ? 1 : 0);
if (i1 % 4 == 0)
printf(" ");
}
printf("(2)\n");
printf("X ");
for (i2 = 15; i2 >= 0; i2--) { // 16비트 2진수를 나타내는 함수입니다.
b2 = 1 << i2;
printf("%d", a2 & b2 ? 1 : 0);
if (i2 % 4 == 0)
printf(" ");
}
printf("(2)");
printf("\nㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ");
if (a > 32767) {
printf("\n");
printf("나갑니다~\n");
return 0;
}
else if (a2 > 32767) {
printf("\n");
printf("나갑니다~\n");
return 0;
}
else if (a == 0) {
printf("\n");
printf("나갑니다~\n");
return 0;
}
else if (a2 == 0) {
printf("\n");
printf("나갑니다~\n");
return 0;
}
else if (a < -32767) {
printf("\n");
printf("나갑니다~\n");
return 0;
}
else if (a2 < -32767) {
printf("\n");
printf("나갑니다~\n");
return 0;
}
else {
printf("\n");
int i = 0;
for (i = 0; i < 16; i++) { // for 문을 사용해 1~16자리까지 값을 비교하고 출력하는 함수입니다.
int iezoa1= 0;
iezoa1 = pow(2, i);
int eeee = 0;
if (i == 0) {
if (j[16-i] == 1) {
printf(" ");
gwazemul2(-(a * iezoa1)); // 문제의 void 함수입니다. int형식으로 바꾸고 싶은데 방법을 모르겠습니다..
printf("(2) = ");
printf("%d", -(a * iezoa1));
printf(" <");
printf("%d", i + 1);
printf("번째 값>\n");
}
else {
printf(" ");
gwazemul2(0);
printf("(2) = ");
printf("%d", (0));
printf(" <");
printf("%d", i + 1);
printf("번째 값>\n");
}
}
else if (j[16 - i] == 1 && j[17 - i] == 0) {
printf(" ");
gwazemul2(-(a * iezoa1));
printf("(2) = ");
printf("%d", -(a * iezoa1));
printf(" <");
printf("%d", i + 1);
printf("번째 값>\n");
}
else if (j[16 - i] == 0 && j[17 - i] == 1) {
printf(" ");
gwazemul2(a * iezoa1);
printf("(2) = ");
printf("%d", a * iezoa1);
printf(" <");
printf("%d", i + 1);
printf("번째 값>\n");
}
else if (j[16 - i] == 1 && j[17 - i] == 1) {
printf(" ");
gwazemul2(0);
printf("(2) = ");
printf("%d", 0);
printf(" <");
printf("%d", i + 1);
printf("번째 값>\n");
}
else if (j[16 - i] == 0 && j[17 - i] == 0) {
printf(" ");
gwazemul2(0);
printf("(2) = ");
printf("%d", 0);
printf(" <");
printf("%d", i + 1);
printf("번째 값>\n");
}
else {
printf(" ");
gwazemul2(0);
printf("(2) = ");
printf("%d", 0);
printf(" <");
printf("%d", i + 1);
printf("번째 값>\n");
}
}
printf("%d", b);
printf("ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ");
printf("\n답 : ");
gwazemul2(a * a2);
printf("(2) = ");
printf("%d", a * a2);
printf("\n");
}
}
}
피승수, 승수 10진수 값을 각 각 입력받고 승수의 2진법 비트를 배열로 입력받은 상태에서 각 자리별로 비교하고 곱셈을 하는 Booth 알고리즘을 만들고 있습니다.
순서별로 출력은 가능한데, 누적 합을 구하는 방법을 모르겠어서 질문드립니다.
void 함수 값인 gwazemul2(n);
을 int 형식으로 바꾸는 방법이 있을까요?
누적값을 받는다면 더 나은 식을 만들 수 있을 거 같습니다.
출력하고 싶은 부분은 예를 들면
1번째 + 2번째 계산 후 +3번째 +4번째... +16번째
이런 식으로 누적해서 계속 더하고 싶은데 쉽지가 않습니다.
- if 함수가 너무 많아서 헤갈릴 수 있습니다.. 최대한 줄일려 했지만 실력이 많이 후달립니다.
- 사이트 코드 실행기로 오류가 나서 콘솔에 뜨는 과정을 첨부하였습니다. 프로그램은 비주얼 스튜디오로 실행했습니다.