c# - 将一些移位代码从 C++ 复制到 C#

标签 c# c++ bit-shift

我正在尝试将枚举从 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/

相关文章:

c# - 修改控件模板时保留控件的主题风格

C++ msgsnd 和 msgrcv 陷休眠眠

c++ - 如何在函数声明中使用const

c++ - 无法将十六进制数据转移到无符号长整型中

C++ 位操作

c# - 从 C# 中杀死 COM 对象

c# - 无需数据库即可永久存储数据

c# - 如何以编程方式保持自定义设置 Charm 弹出窗口打开?

c++ - VS 2012 中的可变参数模板(Visual C++ 2012 年 11 月 CTP)

bit-shift - 第四为什么负 LSHIFT 会这样表现?