我遇到了一个枚举定义:-
typedef enum NSInteger {
kBorderTypeNone = 0,
kBorderTypeLeft = 1 << 0,
kBorderTypeRight = 1 << 1,
kBorderTypeTop = 1 << 2,
kBorderTypeBottom = 1 << 3
} BorderType;
而且(可能)它可以等同于
typedef enum NSInteger {
kBorderTypeNone = 0,
kBorderTypeLeft = 1 ,
kBorderTypeRight = 2,
kBorderTypeTop = 4,
kBorderTypeBottom = 8
} BorderType;
内部差异是什么(如果有的话)?一个比另一个有什么优势吗?推荐哪一个?
编辑 1:如果两者相同,那么编译器如何处理它?在编译器的哪个阶段,它被简化为同一组指令?
它们是相同的,前一种语法更容易添加更多元素(线性数字增加而不是 2 的幂)。
两种格式编译为相同。从简单的编程角度来看,第一个是有效的。第二个在编译期间更有效,因为它是直接分配值。
没有这样的区别。此枚举用作标志,在这种情况下,您的第一个定义更具可读性。
typedef enum NSInteger {
kBorderTypeNone = 0, // binary 0000
kBorderTypeLeft = 1 << 0, // binary 0001
kBorderTypeRight = 1 << 1, // binary 0010
kBorderTypeTop = 1 << 2, // binary 0100
kBorderTypeBottom = 1 << 3 // binary 1000
} BorderType;
此外,正如san的回答所表明的那样,econd one在处理过程中更有效率,因为它是价值的直接分配。