我今天看到了这行代码并且不知道它的作用。
typedef enum {
SomeOptionKeys = 1 << 0 // ?
} SomeOption;
某些用法或示例会有所帮助。谢谢!
答案 0 :(得分:9)
它看起来像是定义了一个应该包含一组标志的枚举类型。您希望看到更多定义,例如:
typedef enum {
FirstOption = 1 << 0,
SecondOption = 1 << 1,
ThirdOption = 1 << 2
} SomeOption;
由于它们被定义为2的幂,因此每个值对应于整数变量中的单个位。因此,您可以使用按位运算符组合它们并测试它们是否已设置。这是C代码中的常见模式。
您可以编写这样的代码组合它们:
SomeOption myOptions = FirstOption | ThirdOption;
您可以检查哪些选项设置如下:
if (myOptions & ThirdOption)
{
...
}
答案 1 :(得分:4)
SomeOptionKeys
的值是1,这在使用flags时是一个有用的表示:
typedef enum {
flag1 = 1 << 0, // binary 00000000000000000000000000000001
flag2 = 1 << 1, // binary 00000000000000000000000000000010
flag3 = 1 << 2, // binary 00000000000000000000000000000100
flag4 = 1 << 3, // binary 00000000000000000000000000001000
flag5 = 1 << 4, // binary 00000000000000000000000000010000
// ...
} SomeOption;
Whit方式每个标志只有一个位设置,它们可以用位图表示。
编辑:
虽然,我不得不说,我可能会遗漏一些东西,但对我来说,使用枚举似乎是不情愿的。由于您在此配置中失去了枚举的任何优势,因此您也可以使用#define
:
#define flag1 (1<<0)
#define flag2 (1<<1)
#define flag3 (1<<2)
#define flag4 (1<<3)
#define flag5 (1<<4)
答案 2 :(得分:2)
它只是将枚举设置为值1.它可能旨在表示值为2的幂。下一个可能被指定为1 << 1
等。
答案 3 :(得分:1)
&LT;&LT;是左移算子。通常,当您希望枚举掩盖单个位时使用此选项。在这种情况下,转换实际上并没有做任何事情,因为它是0,但你可能会看到它出现在更复杂的情况下。
示例可能如下所示:
typedef enum {
OptionKeyA = 1<<0,
OptionKeyB = 1<<1,
OptionKeyC = 1<<2,
} OptionKeys;
然后,如果你有一些带有选项键的函数,你可以使用枚举作为位掩码来检查是否设置了一个选项。
int ASet( OptionKeys x){
return (x & OptionKeyA);
}
或者,如果您有一个标志位图并想要设置一个选项:
myflags | OptionKeyB