我一直在看开放源代码项目中的一些代码,并注意到,在不止一次的情况下,枚举的值是通过将一个值递增位移位数来分配的。我看不到这样做的任何特定原因,也看不到通过仅增加+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
,则可以组合值,并且仍对其进行解码,因此可以确切地看到生成特定值所需的输入。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句