我是编码的新手,我正在努力完成这项任务,但我无法让它发挥作用:
编写并使用一个以掩码作为参数并返回结构的函数。
这是我到目前为止所做的。有人能帮我理解我做错了吗?
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;
}
答案 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)