将位比较从c++转换为c#

本文关键字:转换 c++ 比较 | 更新日期: 2023-09-27 18:16:16

我已经从cpp源获得了给定的条件。

if (!(faces & activeFace) || [...]) { ... }

我想把它翻译成c#。

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

那么在c#中等效的是什么呢?
注意:我不能使用faces.HasFlag(activeFace)

应该是

if ((faces & activeFace) == 0 || [...]) { ... }

我说的对吗?

为了完整起见,这里实际的Flag enum

[Flags]
enum Face {
    North = 1,
    East = 2,
    South = 4,
    West = 8,
    Top = 16,
    Bottom = 32
};
在cpp中也是一样的,你只需要在c#中添加一个[Flags]属性

将位比较从c++转换为c#

将值None = 0添加到enum

[Flags]
enum Face {
    None = 0,
    North = 1,
    East = 2,
    South = 4,
    West = 8,
    Top = 16,
    Bottom = 32
};

,然后测试

if ((faces & activeFace) == Face.None || otherExpr) {
    ...
}

在枚举中添加0常量的一个很好的理由是,类字段默认为零,省略0常量将导致枚举值不对应任何枚举常量。在c#中这样做是合法的,但这不是一个好的实践。c#不测试赋给枚举的值是否为有效的枚举常量。

但如果不能更改枚举,则可以将枚举值强制转换为int

if ((int)(faces & activeFace) == 0 || otherExpr) {
    ...
}

是的,在c++中,任何int不相等的0被认为是布尔true值,所以!(faces & activeFace)在c++中意味着:activeFace是而不是在faces