从C++;到C# 我试图把枚举从C++代码转换成C代码,而且我的头绕着它有困难。C++代码是: enum FOO { FOO_1 = 0, FOO_2, // etc } #define MASK(x) ((1 << 16) | (x)) enum DISP { DISP_1 = MASK(FOO_1), DISP_2 = MASK(FOO_2), // etc } enum FOO{ FOO_1=0, 富二, //等 } #定义掩码(x)((1

从C++;到C# 我试图把枚举从C++代码转换成C代码,而且我的头绕着它有困难。C++代码是: enum FOO { FOO_1 = 0, FOO_2, // etc } #define MASK(x) ((1 << 16) | (x)) enum DISP { DISP_1 = MASK(FOO_1), DISP_2 = MASK(FOO_2), // etc } enum FOO{ FOO_1=0, 富二, //等 } #定义掩码(x)((1,c#,c++,bit-shift,C#,C++,Bit Shift,只需将掩码替换为它的定义(掩码(x)通过构造一个数字,或将一个数字x替换为一个二进制数1000000000000000(一个向左移动16次) 在C#中,可以直接使用表达式,如下所示: enum FOO { FOO_1 = 0, FOO_2, // etc } enum DISP { DISP_1 = (1<<16) | (int)(FOO.FOO_1), DISP_2 = (1<<16) | (int)(FOO.FOO_2),

只需将
掩码
替换为它的定义(
掩码(x)
通过
构造一个数字,或将一个数字
x
替换为一个二进制数
1000000000000000
(一个向左移动16次)

在C#中,可以直接使用表达式,如下所示:

enum FOO {
    FOO_1 = 0,
    FOO_2,
    // etc
}

enum DISP
{
    DISP_1 = (1<<16) | (int)(FOO.FOO_1),
    DISP_2 = (1<<16) | (int)(FOO.FOO_2),
    // etc
}
enum FOO{
FOO_1=0,
富二,
//等
}
枚举显示
{

DISP_1=(1当您进行位移位时,它将所有1和0向左或向右移位一定数量的值


在您的情况下,
1DISP_x的数值相等:

DISP_1 == 0x10000
DISP_2 == 0x10001
DISP_3 == 0x10002
...

位移位运算符在C#中工作,但define宏不工作

要了解发生了什么,您可以分别计算这些值,然后将它们放入枚举中


当然,您知道
|
是按位OR运算符。如果您应该阅读有关移位的运算符
(您不需要+1、+2等),那么其余的将从开始指定的运算符开始依次赋值。DISP_1是唯一需要显式赋值的运算符(而且FOO_1甚至不需要指定,因为它从0开始)。“很像C/C++”可能更相关;)为了回答这个问题,我仍然要说明,DISP_2、DISP_3等实际上将被分配顺序值(除非这个注释足够)。我希望我能把这两个都标记为答案。你的解释既优雅又容易理解,谢谢你!@Kiyura我添加了一条评论,让它更明显。这正是我想要的。谢谢你的例子!
enum FOO {
    FOO_1 = 0,
    FOO_2,
    // etc
}

enum DISP
{
    DISP_1 = (1<<16) | (int)(FOO.FOO_1),
    DISP_2 = (1<<16) | (int)(FOO.FOO_2),
    // etc
}
enum Foo { //this may not be needed anymore?
   FOO_1 = 0, FOO_2, ... etc
}

enum Disp { //DISP_2 gets the next value ie 65536 + 1, and so forth
   DISP_1 = 65536, DISP_2, DISP_3, ... etc
DISP_1 == 0x10000
DISP_2 == 0x10001
DISP_3 == 0x10002
...
1 << 16 = 10000000000000000_2 //those are 16 zeroes and _2 indicates binary
10000000000000000_2 = 65536
1 << 1 = 2
1 << 2 = 4
1 << 3 = 8
1 << 1 <=> 1 * 2^1 = 2
1 << 2 <=> 1 * 2^2 = 4
1 << 3 <=> 1 * 2^3 = 8
DISP_1 = MASK(FOO_1)
=>
DISP_1 = ((1 << 16) | (FOO_1))
=>
DISP_1 = (65536 | (FOO_1))
=>
DISP_1 = (65536 | FOO_1)
=>
DISP_1 = (65536 | 0)
=>
DISP_1 = 65536
DISP_2 = (65536 | FOO_2)
=>
DISP_2 = (65536 | 1)
=>
DISP_2 = 65537
enum FOO
{
    FOO_1 = 0,
    FOO_2,
    // etc
}

enum DISP
{
    DISP_1 = (1<<16) | (int)(FOO.FOO_1),
    DISP_2 = (1<<16) | (int)(FOO.FOO_2),
    // etc
}