- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我一直在查看开源项目的一些代码,并注意到在不止一次的情况下,枚举的值是通过将一个值移位一个递增的位置来分配的。我看不到这样做的任何具体原因,也看不出通过仅递增 +1 来提高分配值的效率。
尽管如此,如果没有一些代码来证明让我感到困惑的地方,这可能毫无意义。
1 级
enum EventType {
NONE = 0,
PUSH = 1<<0,
RELEASE = 1<<1,
DOUBLECLICK = 1<<2,
DRAG = 1<<3,
MOVE = 1<<4,
KEYDOWN = 1<<5,
KEYUP = 1<<6,
FRAME = 1<<7,
RESIZE = 1<<8,
SCROLL = 1<<9,
PEN_PRESSURE = 1<<10,
PEN_ORIENTATION = 1<<11,
PEN_PROXIMITY_ENTER = 1<<12,
PEN_PROXIMITY_LEAVE = 1<<13,
CLOSE_WINDOW = 1<<14,
QUIT_APPLICATION = 1<<15,
USER = 1<<16
};
2 级
enum EventType {
EVENT_MOUSE_DOUBLE_CLICK = osgGA::GUIEventAdapter::DOUBLECLICK,
EVENT_MOUSE_DRAG = osgGA::GUIEventAdapter::DRAG,
EVENT_KEY_DOWN = osgGA::GUIEventAdapter::KEYDOWN,
EVENT_SCROLL = osgGA::GUIEventAdapter::SCROLL,
EVENT_MOUSE_CLICK = osgGA::GUIEventAdapter::USER << 1,
EVENT_MULTI_DRAG = osgGA::GUIEventAdapter::USER << 2, // drag with 2 fingers
EVENT_MULTI_PINCH = osgGA::GUIEventAdapter::USER << 3, // pinch with 2 fingers
EVENT_MULTI_TWIST = osgGA::GUIEventAdapter::USER << 4 // drag 2 fingers in different directions
};
如果我没看错的话,EventType::USER 的二进制值为 65536 或 10000000000000000。 EVENT_MULTI_TWIST 的二进制值为 1048576 或 100000000000000000000。
以这种方式分配枚举值的目的是什么,而不是像这样:
enum EventType {
NONE = 0,
PUSH = 1,
RELEASE = 2,
DOUBLECLICK = 3,
DRAG = 4,
MOVE = 5,
KEYDOWN = 6,
KEYUP = 7,
FRAME = 8,
RESIZE = 9,
SCROLL = 10,
PEN_PRESSURE = 11,
PEN_ORIENTATION = 12,
PEN_PROXIMITY_ENTER = 13,
PEN_PROXIMITY_LEAVE = 14,
CLOSE_WINDOW = 15,
QUIT_APPLICATION = 16,
USER = 17
};
最佳答案
这样做的通常原因是将每个枚举值与最终 v 值的一位相关联,因此您可以(例如)将多个标志编码到一个变量中。
例如,对于典型的 32 位系统,您可以将(显然足够)32 个单独的标志编码为单个 32 位 int
(或者,最好是 unsigned int
).
例如,如果您正在查看键盘上的键,您可以将“普通”键(如字母和数字)编码为一个字节(可能使用连续的值,如您所建议的),以及“修饰符”键,如shift、alt 和 control 作为单独的位。这将允许您(例如)将诸如 control+alt+A 之类的内容编码为单个值。
同样,对于鼠标消息,您可以将鼠标按钮视为“修饰符”,因此您可以将拖动鼠标之类的内容编码为单个值。
在这两种情况下,将“修饰符”编码为单独的位的重点在于,这允许您稍后明确地检索这些修饰符——如果在值中设置了正确的位,则使用了该修饰符。相比之下,如果您只是使用连续的数字,则之后无法提取单个片段。例如,如果您将输入编码为 1
、2
和 3
,则无法判断 3
> 意在表示对应于3
的原始输入,或者同时有1
和2
的输入。但是,如果您将这些值编码为 1
、2
和 4
,您可以组合这些值,并且仍然对它们进行解码,因此您可以看到产生特定值(value)所需的确切输入。
关于C++使用位移位分配显式枚举值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18841113/
我是一名优秀的程序员,十分优秀!