zoukankan      html  css  js  c++  java
  • 测试中的代码分享~位运算用担心重复赋值吗

    如果不清楚位运算的同学,可以看我的这篇文章《基础才是重中之重~位的运算》及《整形变量是否可以进行位运算(像枚举类型一样)

    今天我们主要要作的是,验证位运算中或运算与加法运算(+),与非运算(减操作)与减法运算(-)之间的区别,对于一个被标示为Flags特性的枚举类型和特殊的数值类型(2的N次方组成)来说,它们的位运算会存在一些特性,而我们利用这些特性可以减少我们程序设计时的复杂度,这个很重要。

    我们的例子用一个枚举类型的对象FileProperty来说明,看它的定义如下:

        [Flags]
        enum FileProperty
        {
            Read = 1,
            Write = 2,
            Replace = 4,
        }

    下面是对这个对象的位运算,先看一个或运算,我更习惯称它为加法位运算:

              var en = FileProperty.Read.GetHashCode()
                    | FileProperty.Replace.GetHashCode()
                    | FileProperty.Read.GetHashCode()
                    | FileProperty.Read.GetHashCode()
                    | FileProperty.Replace.GetHashCode();
          var enAdd = FileProperty.Read.GetHashCode()
                   + FileProperty.Replace.GetHashCode()
                   + FileProperty.Read.GetHashCode()
                   + FileProperty.Read.GetHashCode()
                   + FileProperty.Replace.GetHashCode();
        Console.WriteLine("位运算结果{0},普通加法运算结果{1}", en.GetHashCode(), enAdd.GetHashCode());

    我们看到,代码中的FileProperty.Read被加了多次,我们看一下结果

    通过上面的例子,我们知道,位运算时,无论你的相同的数值有多少重复,结果在计算时,只会产生一个值,如果想知道原理,可以把它转换成二进制,结果就不难看出了。(或运算原则是:两个操作数,按位置进行或运算,其中一个数只要为1,结果就为1)

    123  //十进制
    11011 //二进制
    1 1 1011//在二进制中,我们可以看出来,无论是有多个1,它在与10进行或运算时,结果都是11,呵呵。

    下面是位运算中的与非运算,我更习惯称它为减法位运算:

       var en2 = FileProperty.Read
                   | FileProperty.Replace
                   | FileProperty.Read
                   | FileProperty.Read
                   | FileProperty.Replace;
       en2 = en2 & (~(FileProperty.Read | FileProperty.Read)); //结果为FileProperty.Replace
       Console.WriteLine("位运算中的减法运算结果为{0}", en2);

    结果为:

    而如果希望检查一个枚举对象中(Flags类型的)是否包含某个枚举元素,可以使用.net4.0中的HasFlag方法,让我们来看一下

                string resultMsg = en + "中是否包括{0}元素,结果为{1}";
                Console.WriteLine(resultMsg, FileProperty.Read,en.HasFlag(FileProperty.Read));//结果为true
                Console.WriteLine(resultMsg, FileProperty.Write,en.HasFlag(FileProperty.Write));//结果为false
                Console.WriteLine(resultMsg, FileProperty.Replace,en.HasFlag(FileProperty.Replace));//结果为true

    结果为:

    利用这个特性,我们有这样的一个工作,找到所有文件包含的属性种类,看代码:

        public class File
        {
            public long FileID { get; set; }
            public string Filename { get; set; }
            public FileProperty FileProperty { get; set; }
        }
               
               List<File> fileList = new List<File> 
                {
                  new  File{FileID=1,Filename="1.txt", FileProperty=FileProperty.Read},
                  new  File{FileID=2,Filename="2.txt", FileProperty=FileProperty.Replace},
                };
                fileList.Add(new File
                {
                    FileID = 3,
                    Filename = "3.txt",
                    FileProperty = FileProperty.Read | FileProperty.Replace,
                });
                FileProperty propertyAll = FileProperty.None;
                fileList.ForEach(i =>
                {
                    propertyAll |= i.FileProperty;
                });
                Console.WriteLine("fileList所包含的属性为" + propertyAll);

    结果为:

    有时,我们多掌握一点知识,可能会使我们设计的程序更加简单,呵呵!

  • 相关阅读:
    [模板] 循环数组的最大子段和
    [最短路][几何][牛客] [国庆集训派对1]-L-New Game
    [洛谷] P1866 编号
    1115 Counting Nodes in a BST (30 分)
    1106 Lowest Price in Supply Chain (25 分)
    1094 The Largest Generation (25 分)
    1090 Highest Price in Supply Chain (25 分)
    树的遍历
    1086 Tree Traversals Again (25 分)
    1079 Total Sales of Supply Chain (25 分 树
  • 原文地址:https://www.cnblogs.com/lori/p/3342781.html
Copyright © 2011-2022 走看看