0

次の例のように、2 つの文字を比較する必要があります。

COMPARE('a','z') Will return -1
COMPARE('a','A') Will return -1
COMPARE('g','g') WIll return 0
COMPARE('A','a') Will return 1

一般に、 Function:strcmp()と同じようにそれらを比較する必要がありますが、比較にはビットごとの演算子を使用する必要があります。これが私が今やったことです。

int Lcmp(char unsigned first,char unsigned sec)
{
    int i;
    char unsigned mask=0x80; //mask = 10000000 in binary
    for(i=0;i<7;i++)
    {
        if(first&mask&&(!(sec&mask)))  //first>sec, Beacuase first had the sum 2^7
        {
            return 1;
        }
        else if((!(first&mask))&&(sec&mask)) //first<sec " " " "
        {
            return -1;
        }
        mask>>=1; //move the comparsion bit rigth
    }
    return 0; //CASE: first==sec
}

私の問題は; このコードは機能しません。そして、私が意味するのはうまくいかないということです.パターンなしで常にFALSEの結果が得られます. 修理してください、ありがとう。注:辞書で比較する関数が必要です

編集:

I added this statment after the mask decleretion.
    if(first<'a'&&sec>='a')
            first^=mask;
        else if(first>='a'&&sec<'a')
            sec^=mask;

私がしたことは、それらの1つが大文字である場合にMSBを削除し、小文字にアドベテジを与えることです。

4

1 に答える 1

0

等しいかどうかは xor で簡単にチェックできます。

大文字と小文字が区別されると仮定すると、ビット 6 で大文字と小文字が異なるため、0x20 でマスキングすると大文字と小文字がチェックされます。

int Lcmp(char unsigned first,char unsigned sec)
{
        unsigned char diff = first^sec;
        if (!diff)
        {
                // bits the same
                return 0;
        }

        if (diff & 0x20)
        {
                // case differs
                if (first & 0x20)
                {
                        // sec is capital
                        return -1;
                }
                // first is capital
                return 1;
        }

        // same case - find highest different bit
        char unsigned mask=0x80;
        while (!(mask & diff))
        {
                mask >>=1;
        }

        if (first & mask)
        {
                // first has highest differentbit set
                return 1;
        }

        // sec has highest different bit set 
        return -1;
}
于 2013-06-30T18:14:34.163 に答える