在 C# 中对位域执行加法
Perform addition on bit-fields in C#
我正在使用 C# 实现五子棋,该项目的第一个挑战是智能地表示棋盘的状态。
为了实现这个目标,我决定转向位域来表示组合的值:
[Flags]
public enum CombinationValue : byte
{
OnePawn = 1,
TwoPawns = 2,
ThreePawn = 4,
FourPawn = 8,
FivePawns = 16
}
我偶然发现的问题是,当我想增加一个组合时,我想取消设置前一位并设置一个新位,这基本上是二进制左移,这是不允许的枚举。
例如,假设我有两个 pawn 的组合,一个 pawn 放在它旁边,所以枚举的值必须变成 "ThreePawn" 而不是 "TwoPawns".
基本上,我想要做的是 TwoPawns + OnePawn == ThreePawns。
实现此行为的最有效方法是什么?
如果我没理解错的话,你可以这样做:
CombinationValue result = CombinationValue.OnePawn | CombinationValue.TwoPawns;
但是你需要将 ThreePawn 作为 3。
这不是应该使用标志的方式。标志用于在单个字节中指定 开关 ,因此给定二进制 0000
第一位表示一个元素是 "on",第二位表示一个不同的元素,等等.
所以 element1 表示为:1 = 0001
,Element2:2= 0010
,Element3:4 = 0100
,等等。所以要打开元素 1 和元素 2,请使用二进制 0011
或 3
(1+2
).
仅供参考;这可以追溯到计算机内存有限并且能够以少量位表示多个状态的时代。
你要的从二进制的角度看是没有意义的,三只大虾就是0011
或者switch 1和2。这不是真正的"state"。这就是开关的用途。
如果要指定大虾的数量和性能加法,好老套的有什么不好int
?
我正在使用 C# 实现五子棋,该项目的第一个挑战是智能地表示棋盘的状态。
为了实现这个目标,我决定转向位域来表示组合的值:
[Flags]
public enum CombinationValue : byte
{
OnePawn = 1,
TwoPawns = 2,
ThreePawn = 4,
FourPawn = 8,
FivePawns = 16
}
我偶然发现的问题是,当我想增加一个组合时,我想取消设置前一位并设置一个新位,这基本上是二进制左移,这是不允许的枚举。 例如,假设我有两个 pawn 的组合,一个 pawn 放在它旁边,所以枚举的值必须变成 "ThreePawn" 而不是 "TwoPawns".
基本上,我想要做的是 TwoPawns + OnePawn == ThreePawns。
实现此行为的最有效方法是什么?
如果我没理解错的话,你可以这样做:
CombinationValue result = CombinationValue.OnePawn | CombinationValue.TwoPawns;
但是你需要将 ThreePawn 作为 3。
这不是应该使用标志的方式。标志用于在单个字节中指定 开关 ,因此给定二进制 0000
第一位表示一个元素是 "on",第二位表示一个不同的元素,等等.
所以 element1 表示为:1 = 0001
,Element2:2= 0010
,Element3:4 = 0100
,等等。所以要打开元素 1 和元素 2,请使用二进制 0011
或 3
(1+2
).
仅供参考;这可以追溯到计算机内存有限并且能够以少量位表示多个状态的时代。
你要的从二进制的角度看是没有意义的,三只大虾就是0011
或者switch 1和2。这不是真正的"state"。这就是开关的用途。
如果要指定大虾的数量和性能加法,好老套的有什么不好int
?