编写并使用以掩码作为参数并返回结构的函数

时间:2012-09-04 01:32:49

标签: c struct bitmask

我是编码的新手,我正在努力完成这项任务,但我无法让它发挥作用:

  

编写并使用一个以掩码作为参数并返回结构的函数。

这是我到目前为止所做的。有人能帮我理解我做错了吗?

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;

}

1 个答案:

答案 0 :(得分: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)