将按位比较从C++转换为C#

boo*_*oop 9 c# bitwise-operators bitwise-and

我是来自cpp源的给定条件.

if (!(faces & activeFace) || [...]) { ... }
Run Code Online (Sandbox Code Playgroud)

我想把它翻译成C#.

当我理解这一点时,这意味着if activeFace is *not* in faces then...- 不是吗?

那么C#中的等价物是什么?
注意:我不能使用faces.HasFlag(activeFace)

那应该是

if ((faces & activeFace) == 0 || [...]) { ... }
Run Code Online (Sandbox Code Playgroud)

我对吗?

为了完整性,这里是实际的标志枚举

[Flags]
enum Face {
    North = 1,
    East = 2,
    South = 4,
    West = 8,
    Top = 16,
    Bottom = 32
};
Run Code Online (Sandbox Code Playgroud)

那么它在cpp中是一样的,你只需要[Flags]在C#中添加一个属性

Oli*_*bes 5

我会None = 0为枚举添加一个值

[Flags]
enum Face {
    None = 0,
    North = 1,
    East = 2,
    South = 4,
    West = 8,
    Top = 16,
    Bottom = 32
};
Run Code Online (Sandbox Code Playgroud)

然后测试

if ((faces & activeFace) == Face.None || otherExpr) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

0向枚举中添加常量的一个很好的理由是,默认情况下类字段为零,省略0常量会导致枚举值与任何枚举常量不对应.在C#中这样做是合法的,但这不是一个好习惯.C#不测试分配给枚举的值是否是有效的枚举常量.

但是如果你不能改变枚举,你可以将枚举值转换为 int

if ((int)(faces & activeFace) == 0 || otherExpr) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

是的,在C++中,任何int不等的0都被视为布尔true值,因此!(faces & activeFace)在C++中意味着:activeFace 不在 faces中