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;

编辑:

好的,因为这是一个作业,让我来解释一下它是如何工作的:

我相信你知道,你的枚举看起来像这样(二进制):

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

现在,使用按位 OR 运算符|,您可以将两种技能合并在一起:

   00001
OR 01000
   _____
   01001

然后,我们可以使用以下命令检查新的多技能枚举是否具有某些特定技能&

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

为了更高级,我们使用 XOR,根据定义,0如果两个位相等,则将结果位设置为:

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

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