C ++使用移位为Enums分配显式值

mdoran3844

我一直在看开放源代码项目中的一些代码,并注意到,在不止一次的情况下,枚举的值是通过将一个值递增位移位数来分配的。我看不到这样做的任何特定原因,也看不到通过仅增加+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为单个值。

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

在这两种情况下,将“修饰符”编码为单个位的重要之处在于,这使您以后可以明确地检索这些修饰符-如果在值中设置了正确的位,则使用该修饰符。相比之下,如果仅使用连续数字,则以后不能提取单个片段。例如,如果你有编码作为输入12并且3,可以不告诉是否3旨在指示对应于原始输入3或两者的输入端12在同一时间。但是,如果将值编码为124,则可以组合值,并且仍对其进行解码,因此可以确切地看到生成特定值所需的输入。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用C#错误“无法在表中为标识列插入显式值”

来自分类Dev

如何确定函数参数是自动设置为默认值还是在C ++中显式设置?

来自分类Dev

Frama C中的显式值分析

来自分类Dev

使用显式选项将C#GNUPlot 2图形合二为一

来自分类Dev

C ++为属性分配值

来自分类Dev

在C中分配指针时的显式转换

来自分类Dev

当 IDENTITY_INSERT 设置为 OFF 时,C# 无法为表“Rentals”中的标识列插入显式值

来自分类Dev

cppcheck建议的C ++使用显式

来自分类Dev

使用strcpy()在C中为指针正确分配值

来自分类Dev

C#如何在不使用值的情况下显式调用getter

来自分类Dev

C++:按位移位为零值

来自分类Dev

C#为变量分配新值

来自分类Dev

C ++中向量的移位值

来自分类Dev

在C中移位位值

来自分类Dev

C#:使用反射动态调用显式实现的方法

来自分类Dev

C ++使用显式参数检测自由函数的存在

来自分类Dev

C ++:使用参数包显式调用函数重载

来自分类Dev

使用clang的显式C ++模板实例化

来自分类Dev

C#:使用反射动态调用显式实现的方法

来自分类Dev

在C#中使用显式类型转换

来自分类Dev

在C ++中为已分配的内存分配值

来自分类Dev

显式C ++宏扩展

来自分类Dev

C中的显式MOD?

来自分类Dev

显式C ++宏扩展

来自分类Dev

使用 scanf 为数组中的每个值分配时间的程序 (C)

来自分类Dev

C / C ++中的显式转换

来自分类Dev

C ++ 11:显式复制值以用作右值引用的最短方法

来自分类Dev

显式/隐式类型转换C ++

来自分类Dev

显式/隐式类型转换C ++