gpt4 book ai didi

C++使用位移位分配显式枚举值

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:02:19 26 4
gpt4 key购买 nike

我一直在查看开源项目的一些代码,并注意到在不止一次的情况下,枚举的值是通过将一个值移位一个递增的位置来分配的。我看不到这样做的任何具体原因,也看不出通过仅递增 +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).

例如,如果您正在查看键盘上的键,您可以将“普通”键(如字母和数字)编码为一个字节(可能使用连续的值,如您所建议的),以及“修饰符”键,如shiftaltcontrol 作为单独的位。这将允许您(例如)将诸如 control+alt+A 之类的内容编码为单个值。

同样,对于鼠标消息,您可以将鼠标按钮视为“修饰符”,因此您可以将拖动鼠标之类的内容编码为单个值。

在这两种情况下,将“修饰符”编码为单独的位的重点在于,这允许您稍后明确地检索这些修饰符——如果在值中设置了正确的位,则使用了该修饰符。相比之下,如果您只是使用连续的数字,则之后无法提取单个片段。例如,如果您将输入编码为 123,则无法判断 3 > 意在表示对应于3的原始输入,或者同时有12的输入。但是,如果您将这些值编码为 124,您可以组合这些值,并且仍然对它们进行解码,因此您可以看到产生特定值(value)所需的确切输入。

关于C++使用位移位分配显式枚举值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18841113/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com