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

fits_bits 함수

바로이순간 2013. 9. 21. 18:23

다음과 같은 프로토타입을 갖는 함수를 작성하시오.


return 1 when x can be represented as an n-bit, 2's complement number;

0 otherwise Assume 1 <= n <= w, 여기서 w=sizeof(int)*8


int fits_bits(int x, int n);

* 조건문,루프,SWITCH,함수,매크로 호출,나눗셈,MOD,<,>등 관계비교연산자 금지

* 비트수준 논리연산, 좌측,우측 쉬프트, 덧셈,뺄셈, ==과 !=, 캐스팅 허용

* 정수는 2의 보수 형태로 나타낸다, 부호형 데이터의 우측 쉬프트는 산술적으로, 

여기까지가 문제입니다.

===================================================================


네이버 지식인 ghldhr00 님의 답변을 기초로한 것입니다.

http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=180926760


#include <stdio.h>

#define w (sizeof(int) * 8)                       // int 형의 비트 크기

int fits_bits(int x, int n) {

    // 부호있는 정수 x를 부호없는 정수 ux 로 옮겨줍니다.

    unsigned int ux = (unsigned int) x;   // unsigned x

 

    //  NNNN은 n비트로 나타낸 부분이라고 하겠습니다. [아래에서 n은 4인 경우]

    // M'MMM MMMM MMMM MMMM MMMM MMMM MMMM NNNN

    // 여기서 M'과 M이 같다면 오버플우가 아닙니다.


    // ux<<1을 하면

    //     MMMM MMMM MMMM MMMM MMMM MMMM MMMN NNN0 이 되고

    // 이를 >>n 하면

    //     0000 MMMM MMMM MMMM MMMM MMMM MMMM MMMN 이 됩니다. [1]

    //     바로 위에서 x가 양수일때 오버플로우가 안될려면 M', M, N 모두 0이라야 한다. [처음 N]

    //                       x가 음수일때 오버플로우가 안될려면 M', M, N 모두 1이라야 한다. [처음 N]

    //                                  이 경우 n개의 0 다음에는 모두 1이 와야 한다.


    // M' 이 1일경우:

    //     M'<<(w-n)을 하면 

    //           0001 0000 0000 0000 0000 0000 0000 0000 이 되고

    //           M'을 빼주면

    //           0000 1111 1111 1111 1111 1111 1111 1111 이 됩니다. [2]

    //                   n개의 0다음에는 모두 1이 옵니다.


    //  [1], [2] 로 부터 M'이 0이든 1이든 서로 같다면 오버플로우가 아닙니다.


    unsigned int mm = (ux << 1) >> n;   // MMMM...M

    unsigned int mp = ux >> (w-1);         // mp는 부호 비트 0또는 1


    printf("ux=%08x\n", ux);

    printf("mm=%08x\n", mm);

    printf("mp=%08x\n", mp);

    printf("mp<<(w-n)=%08x\n", mp<<(w-n));


    return mm == (mp << (w-n)) - mp;

}

int main() {

    int x, n;

    while(1) {

        printf("x n 입력: ");

        scanf("%d%d", &x, &n);

        if(x==0) { break; }

        if(fits_bits(x, n)) {

            printf("fits\n");

        } else {

            printf("not\n");

        }

    }

    return 0;

}


위의 프로그램에서 n의 값이 w의 값과 같을 경우는 fits_bits가 정상적으로 동작하지 않습니다.

그 이유는 x<<y 에서 y의 값이 w일 경우에는 연산이 정의가 되지 않기 때문인 것으로 보입니다.


return (n==w) | (mm == (mp << (w-n)) - mp); 로 고치면 이문제가 해결되는 군요!


'c·c++ > c 프로그래밍' 카테고리의 다른 글

비쥬얼 c++ cntrl+F5 가 안먹힐 때  (0) 2013.09.22
비쥬얼 c++ cmd 창에서 실행하기  (0) 2013.09.22
주민번호 판별  (0) 2013.09.18
3x3 행렬식(determinant) 구하기  (0) 2013.09.15
Hadamard 행렬구하기  (0) 2013.09.15