关于位运算,网上有挺多好的博客介绍过,我就不多解释了
这里只记录一个小例子,是在理解位运算时候写的,帮助自己加深一下印象,做个笔记mark一下
具体场景
摇骰子游戏
1每个骰子有6个点,1-3为小,4-6为大,[1,3,5]为单,[2,4,6]为双
2每次扔3个骰子
问题:如果把每场结果设成实体对象,那么该如何设计呢?
其他的属性就不过多纠结,主要在3个骰子这里
不管是把骰子设成复杂对象,或者是把每个骰子的大小单双分开记下来,都会显得很麻烦
如果使用位运算,就会变得简单许多,代码如下:
1 public class GameResult
2 {
3 //第一个骰子
4 public int FirstDiceValue { get; set; }
5 public Mode FirstDiceMode { get { return SetModel(FirstDiceValue); } }
6 //第二个骰子
7 public int SecondDiceValue { get; set; }
8 public Mode SecondDiceMode { get { return SetModel(SecondDiceValue); } }
9 //第三个骰子
10 public int ThirdDiceValue { get; set; }
11 public Mode ThirdDiceMode { get { return SetModel(ThirdDiceValue); } }
12
13 private Mode SetModel(int value)
14 {
15 Mode Size;
16 Mode EvenOdd;
17 if (value >= 3) Size = Mode.大;
18 else Size = Mode.小;
19 if (value % 2 == 0) EvenOdd = Mode.双;
20 else EvenOdd = Mode.单;
21 return Size | EvenOdd;
22 }
23 }
24
25 /// <summary>
26 /// 骰子的大小和单双结果枚举
27 /// </summary>
28 [Flags]
29 public enum Mode
30 {
31 //1111 大小单双
32 双 = 1,//0001
33 单 = 2,//0010
34 小 = 4,//0100
35 大 = 8//1000
36 }
打印一下查看结果:
1 class Program
2 {
3 static void Main(string[] args)
4 {
5
6 GameResult resule = new GameResult()
7 {
8 FirstDiceValue = 3,
9 SecondDiceValue = 6,
10 ThirdDiceValue = 2
11 };
12 Console.WriteLine(resule.FirstDiceMode);
13 Console.WriteLine(resule.SecondDiceMode);
14 Console.WriteLine(resule.ThirdDiceMode);
15
16 Console.ReadKey();
17 }
18 }
更正:上面写判断的时候用了[(x>=3 )=> 大],所以3也成了大...
出自:博客园-半路独行
原文地址:https://www.cnblogs.com/banluduxing/p/9300153.html
本文出自于http://www.cnblogs.com/banluduxing 转载请注明出处。