isLessOrEqual.

즉, x, y 두 인자를 받으면 x≤y인지 확인하여 맞으면 1, 틀리면 0을 내놓습니다.

 

이것은 이렇게 하였습니다.

먼저 x≤y ⇒ 0≤y-x입니다.

즉, y - x가 0보다 크거나 같다면 원식을 만족합니다.

0보다 크거나 같은 것을 확인하는 방법은 sign bit가 0임을 확인하는 것입니다.

sign bit는 MSB(Most significant bit)에 있으니

이를 LSB(Least significant bit)에 가져옵니다.

그런 다음에 뺄셈을 한 것의 sign bit를 가져옵니다.

마지막으로 이것들의 진리표를 그려 최소항(minterm)을 가져와서

그것을 연산하여 return하도록 하였습니다.

 

자세한 것은 주석에 적었습니다만, 엉터리 영어로 적은터라 이렇게 한글로 적습니다.^^;;

(하지만 한글도 엉망이네요.;;;)

 

 

/*
* isLessOrEqual - if x <= y  then return 1, else return 0
*   Example: isLessOrEqual(4,5) = 1.
*   Legal ops: ! ~ & ^ | + << >>
*   Max ops: 24
*   Rating: 3
*/
int isLessOrEqual(int x, int y) {
    /*
     * + <= - : false
     * - <= + : true
     * + <= +, - <= - : compare with y - x
     *
     * x'MSB    y's MSB        compare_Function    result
     * 0        0            0                    0
     * 0        0            1                    1
     * 0        1            0                    0
     * 0        1            1                    0
     * 1        0            0                    1
     * 1        0            1                    1
     * 1        1            0                    0
     * 1        1            1                    1
     *
     * So I make minterm : AB' + AC + B'C
     *
     * compare_Function
     * x <= y == 0 <= y - x
     * if y - x => 0 then sign bit(MSB) of y - x is 0
     * else y - x < 0 then sign bit(MSB) of y - x is 1
     * So I shift right because all bit to be same bit(sign bit).
     * Last, I use ! because if sign bit 0, then it's true.
     *
     * 20080402 | 20080405
     */
    int x_MSB_value = !!(x >> 31); // x's MSB
    int y_MSB_value = !!(y >> 31); // y's MSB
    int sub_MSB_value = !((y + (~x + 1)) >> 31); // compare x and y
    return (x_MSB_value & ~y_MSB_value) | (x_MSB_value & sub_MSB_value) | (~y_MSB_value & sub_MSB_value); // minterms
}

크리에이티브 커먼즈 라이선스
Creative Commons License

글에 잘못된 점, 다른 점, 부족한 점이 있다면 지적해주세요.
댓글, 트랙백, 메일 모두 고맙습니다.

트랙백 주소 :: http://nosyu.pe.kr/trackback/1475

댓글을 달아 주세요

  1. 비국민 2008/04/20 08:19  댓글주소  수정/삭제  댓글쓰기

    아... 그렇지; 민텀을 응용한다는게 이거였구나;
    여러가지 경우의 수가 발생하니까 그 케이스들을 민텀을 이용해 식을 만든 거구나;;;

  2. NoSyu 2008/04/20 12:08  댓글주소  수정/삭제  댓글쓰기

    /비국민/
    오오.. 닉네임 좋은걸?^^
    minterm을 이용한다는 것이 이런 의미였어.
    진리표를 만들어서 그 결과를 도출하기 위해 minterm을 이용한 것이지.

[로그인][오픈아이디란?]