typedef枚举语法如'1 << 0'是什么意思?
这个问题在这里已经有了答案:
这对C语言家族来说很常见,并且在C,C ++和Objective-C中的工作方式相同。 与Java,Pascal和类似语言不同,C枚举不限于为其命名的值; 它实际上是一个可以表示所有命名值的整数类型的大小,并且可以将枚举类型的变量设置为枚举成员中的算术表达式。 通常,使用位移来使值的幂为2,并且使用按位逻辑操作来组合值。
typedef enum {
read = 1 << 2, // 4
write = 1 << 1, // 2
execute = 1 << 0 // 1
} permission; // A miniature version of UNIX file-permission masks
再次,移位操作全部来自C.
你现在可以写:
permission all = read | write | execute;
您甚至可以在权限声明本身中包含该行:
typedef enum {
read = 1 << 2, // 4
write = 1 << 1, // 2
execute = 1 << 0, // 1
all = read | write | execute // 7
} permission; // Version 2
你如何打开一个文件的execute
?
filePermission |= execute;
请注意,这是危险的:
filePermission += execute;
这会将价值all
改变为8
,这是没有意义的。
<<
被称为左移运算符。
http://www.techotopia.com/index.php/Objective-C_Operators_and_Expressions#Bitwise_Left_Shift
长话短说1 << 0 = 1
1 << 1 = 2
1 << 2 = 4
1 << 3 = 8
。
它看起来像typedef
代表一个位字段值。 1 << n
是1
左移n
位。 所以每个enum
项代表一个不同的位设置。 该特定的位设置或清除将指示某种状态是两种状态之一。 1
左移零位为1
。
如果声明了数据:
CMAttitudeReferenceFrame foo;
然后,您可以使用enum
值检查四个独立状态中的任何一个,并且foo
不大于int
。 例如:
if ( foo & CMAttitudeReferenceFrameXArbitraryCorrectedZVertical ) {
// Do something here if this state is set
}
链接地址: http://www.djcxy.com/p/12567.html