0

ビットごとの演算子のみを使用し、条件ステートメントを使用せずに、x が y 以下かどうかを調べるメソッドを書き直す必要があります。私はこれまでのところこれを持っています:

int isLessOrEqual(int x, int y)
{
    int a = x + (~y) + 1;
    return ((a&0x80000000) >> 31);
}

しかし、オーバーフローを防ぐ方法がわかりませんか? 誰でも手を差し伸べることができますか?

4

2 に答える 2

0

演習のために、次のねじれたコードは、「+」または条件文なしで実行できます(ブール条件へのキャストを考慮しない限り)。

#define MSB 0x80000000
typedef bool (*RecurseFunc)(unsigned int, unsigned int);

bool EndRecursion(unsigned int ux, unsigned int uy)
{
    // stop recursion - ux cannot be smaller than uy
    return false;
}

bool CompareMSB(unsigned int ux, unsigned int uy)
{
    // jump table, may make global...
    RecurseFunc Handler[2] = {EndRecursion, CompareMSB}; 

    // yMsbBigger == MSB only iff Y"MSB==1 and X:MSB==0
    unsigned int yMsbBigger = ((~ux) & uy) & MSB; 
    // differentMsb will be MSB only iff the MSB of Y different MSB of x
    unsigned int differentMsb = (uy ^ ux) & MSB; 

    // prepare to check on the next bit - shift it to MSB position
    ux <<= 1;
    uy <<= 1;

    // we may want to check the remaining bits if ux,uy had same signs and 
    //     the remaining bits of y are not all 0
    bool mayRecurse = ((bool)uy) && (!(bool)differentMsb); 

    // C will not evaluate the second expression if the first is true
    // the second expression will "EndRecursion" if we may not recurse - 
    //     otherwise recurse
    return (((bool)yMsbBigger) || Handler[mayRecurse](ux, uy));
}

bool isYGreater(int x, int y)
{
    // we reverse the sign bits so positive value will have MSB=1, making it 
    //     "greater" then negative value's MSB
    unsigned int xbits = (unsigned int)x ^ MSB;
    unsigned int ybits = (unsigned int)y ^ MSB;

    return (CompareMSB(xbits, ybits));
}
于 2013-09-24T14:25:49.057 に答える