-4

これが問題です:

C では 2 つの演算 (& と <=) のみを使用し、最大 5 つの演算を使用して、文字がアルファベットの小文字か大文字かを判別します。必要な数の変数を宣言できますが、ビットごとの and (&) および <= 比較の 5 つの操作に制限されています。

例:

is_char('b') = 1
is_char('A') = 1
is_char(10) = 0

6回の手術でできるのに5回の手術でできない…。

ごめん!!誰も制御フローステートメントを使用できないことを含めるのを忘れました:/

4

3 に答える 3

5

これは、5つの操作を使用し、制御フローステートメントを使用せずに実行する方法です。0x20ビットをドロップする(a-z範囲を範囲にマッピングするA-Z)ことにより、2番目の範囲テストを回避します。

int is_char(unsigned char c) {
    return ((c & ~0x20) <= 'Z') & ('A' <= (c & ~0x20))
}

誤ってオペレーターと見なされたくないか~0x20のようにコーディングできることに注意してください。0xdf~

オプティマイザーは冗長性を確認する必要がありますが、変更cするとこれが4つの操作に削減されます。

int is_char(unsigned char c) {
    c &= ~0x20;
    return ('A' <= c) & (c <= 'Z');
}
于 2012-09-17T06:17:12.037 に答える
1

Gabe は、C では char が ASCII テーブルで int として表されることを忘れています。したがって、これは 2 つの操作で実行できます。(ただし、OPは質問について十分に詳しく説明していないと思います)

if (c <= 'A' - 1)
    return 0;
if ('z' + 1 <= c)
    return 0;
return 1;
于 2012-09-17T04:51:58.153 に答える
0

&演算子を使用する必要がありますか? そうでない場合は、次の 4 つの<=操作で実行できます。

if (c <= 'A' - 1)
    return 0;
if (c <= 'Z')
    return 1;
if (c <= 'a' - 1)
    return 0;
if (c <= 'z')
    return 1;
return 0;

注: これは ASCII を想定しており、 の使用は'A' - 1説明のためのものです。定数への変換は、読者の課題として残されています。

于 2012-09-17T04:45:01.727 に答える