Apple有时会在其枚举定义中使用Bitwise-Shift运算符。例如,在Core Graphics的CGDirectDisplay.h文件中:
enum {
kCGDisplayBeginConfigurationFlag = (1 << 0),
kCGDisplayMovedFlag = (1 << 1),
kCGDisplaySetMainFlag = (1 << 2),
kCGDisplaySetModeFlag = (1 << 3),
kCGDisplayAddFlag = (1 << 4),
kCGDisplayRemoveFlag = (1 << 5),
kCGDisplayEnabledFlag = (1 << 8),
kCGDisplayDisabledFlag = (1 << 9),
kCGDisplayMirrorFlag = (1 << 10),
kCGDisplayUnMirrorFlag = (1 << 11),
kCGDisplayDesktopShapeChangedFlag = (1 << 12)
};
typedef uint32_t CGDisplayChangeSummaryFlags;
为什么不像在“normal”enum中那样简单地使用递增的int?
9条答案
按热度按时间pprl5pva1#
也许用十六进制(或二进制)写值会有帮助:-)
现在,您可以添加它们(或“或”它们)并获得不同的值
pw9qyyiw2#
通过这种方式,您可以将多个标志添加到一起以创建一个标志“集”,然后可以使用
&
来查找任何给定的标志是否在这样的集中。如果它只是使用递增的数字,你就无法做到这一点。
示例:
jhkqcmku3#
C# 7中的新功能是最终添加二进制文字,因此您可以将其编写为:
如果你想让事情变得更整洁,你可以用这个:
_
,这也是C# 7的新增功能,它允许您在数字中添加空格,以使内容更具可读性,如下所示:这样就更容易追踪号码了。
ivqmmu1c4#
如果FlagA=1、FlagB=2且FlagC=3,则FlagA或FlagB将给予与FlagC相同的值。移位运算符用于确保每个标志组合都是唯一的。
neekobn85#
这将允许变量轻松地合并多个标志:
5t7ly7z56#
..因为
1<<7
看起来比01000000
更简洁,更容易阅读,不是吗?jchrr9hc7#
让我给予你一个更实际的例子。在C++中,当你想打开一个文件(打开输出,以二进制模式而不是文本模式),你可以这样做:
可以看到,
ios::out | ios::binary
可以设置两种模式(Open for output和in binary mode)。这是如何工作的?它是通过枚举(按位移位值):
如果在
enum _Ios_Openmode
中使用值递增1,则必须对set(ios::out)
和set(ios::binary)
执行两次,一次检查和设置值可能不太方便mklgxw1f8#
我得到了一个带有如下标志的枚举。
现在我已经得到了它的价值这样。
xqk2d5yq9#
使用#define更容易理解,但是枚举可以将这些值组合在一起。