0

私はコーディングが初めてで、この課題を完了しようとしていますが、うまくいきません。

引数としてマスクを受け取り、構造体を返す関数を作成して使用します。

これが私がこれまでに行ったことです。誰かが私が間違っていることを理解するのを手伝ってくれますか?

typedef enum {
    fast = 1,
    slow = 2,
    strong = 4,
    smart = 8,
    agile = 16,
}Skills;

typedef struct _Team {
int ranking;
char name;
} Team;

Team Alabama;

Team USC;

Team _function (Skills skills);
Team _function (Skills skills) {
    if (skills == (fast | smart)) {
        return Alabama; }
    if (skills == (fast | agile))
        return USC;
    else
        return nil;

}
4

1 に答える 1

3

マスクベースの列挙型がある場合、ビット単位の AND 演算子を使用して、その列挙型が満たされているかどうかを確認します&

したがって、スキルが速くて賢いかどうかを確認したい場合は、次のようにします。

if ((skills & fast) && (skills & smart)) {
    // this team has the brains and speed.. possible other stuff
}

または、この状況では、XOR 演算子も適切な候補になります。

if (skills ^ (fast | smart) == 0) {
    // this team has ONLY the brains and speed.
}

最後の注意:

このように列挙型を定義すると、はるかに簡単になります。

typedef enum {
    fast   = 1 << 0,
    slow   = 1 << 1,
    strong = 1 << 2,
    smart  = 1 << 3,
    agile  = 1 << 4,
} Skills;

編集:

OK、これは課題なので、これがどのように機能するかを説明するのに少し苦労させてください:

ご存じのとおり、列挙型は次のようになります (バイナリ):

(00001)
(00010)
...
(10000)

ここで、ビットごとの OR 演算子を使用して、|2 つのスキルを結合することができました。

   00001
OR 01000
   _____
   01001

次に、次を使用して、その新しいマルチスキル列挙型に特定のスキルがあるかどうかを確認できます&

    01001
AND 01000
    _____
    01000 != 0 (aka true)

より高度なレベルに進むには、定義により0、2 つのビットが等しい場合に結果のビットを に設定する XOR を使用します。

    01001
XOR 01000
    _____
    00001 != 0 (aka true)

    01001
XOR 01001
    _____
    00000 == 0 (aka false)
于 2012-09-04T01:48:33.130 に答える