我正在尝试将枚举从 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
}
我不明白 MASK 在做什么,以及我如何在 C# 中模拟功能,或者理解它在做什么并在没有它的情况下手动设置枚举 DISP。
我不确定我所说的是否有道理,但当我不完全确定我在看什么时,这是可以预料的。
最佳答案
当您进行位移时,它会将所有 1 和 0 向左或向右移动一些值。
在你的情况下 1 << 16
以二进制形式创建 10000000000000000。 (是的,那是 16 个零)。
然后它获取该数字并使用 |
这是按位或运算符。因此,无论枚举的整数值是多少,它都会按位或运算为我们移位的那个数字。
例如,如果您使用 MASK(FOO_4)
(字面值为 3)3 在二进制中为 11,因此结果为 10000000000000011。这在功能上与将每个值相加 65,536 相同。
现在,当我们声明第二个枚举时,我们将这些枚举值的值设置为这个奇怪的屏蔽函数。
要在 C# 中做同样的事情,试试这个:
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
关于c# - 将一些移位代码从 C++ 复制到 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12850702/