편집 기록

편집 기록
  • 프로필 nowp님의 편집
    날짜2021.11.21

    void를 int식으로 변환이 어렵습니다.


    #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 함수가 너무 많아서 헤갈릴 수 있습니다.. 최대한 줄일려 했지만 실력이 많이 후달립니다.
    • 사이트 코드 실행기로 오류가 나서 콘솔에 뜨는 과정을 첨부하였습니다. 프로그램은 비주얼 스튜디오로 실행했습니다.

    이미지 이미지

  • 프로필 hesuhesu님의 편집
    날짜2021.11.20

    void를 int식으로 변환이 어렵습니다.


    include

    include

    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 함수가 너무 많아서 헤갈릴 수 있습니다.. 최대한 줄일려 했지만 실력이 많이 후달립니다.

    • 사이트 코드 실행기로 오류가 나서 콘솔에 뜨는 과정을 첨부하였습니다. 프로그램은 비주얼 스튜디오로 실행했습니다..! 이미지 이미지