将位比较从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]
属性
将值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