C#高级编程五十七天----位数组

位数组

假设须要处理非常多位,就能够使用BitArray类和BitVector32.BitArray位于命名空间System.Collections.

BitVector32位于命名空间System.Collections.Speciallized.

 

BitArray

BitArray是一个引用引用类型,包括一个int数组,32位使用一个新整数.bool类型的数组bool[]几乎相同

 

案例:

using System;

using System.Collections;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

namespace 可观察的集合

{

    class Program

    {

        static void Main(string[] args)

        {

            Stack st = new Stack();

            st.Push('A');

            st.Push('B');

            st.Push('C');

 

            BitArray bits1 = new BitArray(8);//一个有8位的数组

            Console.WriteLine("显示数组中全部位的默认值:");

            Display(bits1);

            Console.WriteLine();

 

            bits1.SetAll(true);//SetAll()方法将全部的位都置为1

            bits1.Set(1, false);

            bits1[5] = false;

            bits1[7] = false;

 

            Console.WriteLine("显示数组中全部位的值: ");

            Display(bits1);

 

            Console.WriteLine();

 

            Console.WriteLine("倒转数组中全部位的值: ");

            bits1.Not();//Not()方法的结果是所有的位所有翻转过来.假设某位是true,运行Not()方法的结果就是False

 

            Display(bits1);

 

            Console.ReadKey();

        }

        public static void Display(BitArray bits)

        {

            foreach (bool item in bits)

            {

                Console.WriteLine(item ?1 :0);

            }

        }

    }

}

 

BitArray的其它方法:And(),Or().Xor(),Get()演示:

            //BitArray的其它方法演示

            Console.WriteLine();

            BitArray bits2 = new BitArray(bits1);

            bits2.Set(0, true);

            bits2[1] = false;//效果同Set()方法

            bits2[4] = false;

 

            Console.WriteLine("bits2数组中全部位的值: ");

            Display(bits2);

            Console.WriteLine();

 

            Console.WriteLine("bits1bits2数组Or的值: ");

            bits1.Or(bits2);

            /*

             * 使用And(),Or()Xor()方法,能够合并两个BitArray对象

             * And()方法运行二元AND,仅仅用两个输入数组的位都设置为1,结果位才是1

             * Or()方法运行二元OR,仅仅要有一个输入数组的位设置为1,结果位就是1.

             * Xor()方法是异或操作,仅仅有一个输入数组的位设置为1,结果位才是1

             */

            Display(bits1);

            Console.WriteLine();

            Console.WriteLine("bits1数组Get数字2的值");

            Console.WriteLine(bits1.Get(2));

 

            Console.ReadKey();

 

 

BitVector32结构

相比与BitArray,它的有点事速度快,占用空间小,并能够存储小数字.它内部用一个32位的整数来存储数据,因此仅仅能存储32位的比特数据.

 

先来看一下简单的未操作,常见的位操作无非就是AND,OR,NOT.

案例:比方一个8位的数据:0000 1111

我们想把第二个0设置为1,那么把它和0100 0000进行或操作,就得到结果:0100 1111

 

还是上面的那个数:0000 1111,我们想把 最后一个1设置为0,那么把它和1111 1110这个数进行与操作,疾苦得到了结果:0000 1110

 

总结:想要操作一个位,我们把其它位都设置成0,把这个位设置成1,这个数就是所谓的位掩码(也成位屏蔽,MSDN里用的是为屏蔽)

 

那么假设想要打开一个位(就是把这个位设置成1):

源数据=源数据OR位掩码

 

想要关掉一个位:

源数据=源数据AND位掩码取反

 

解释:位掩码取反就是非(NOT)操作:01,10

 

 

BitVector32的位操作

了解了主要的位操作BitVector32的理解就会简单多了.

 

首先BitVector32本质上用一个32位的数来表示数据,那么初始化BitVector32结构时必须指定一个最初指.用户能够传入一个int或者还有一个已经存在的BitVector32来构造一个新的BitVector32.

 

BitVector32Data属性返回一个int用来表示内部数据,假设用来显示BitVEctor32的内容,这个Data是没有意义的,由于它是十进制化的结果,这时候用BitVector32ToString()方就能够返回实用的文字说明,案例:

            //初始化BitVector32,设置低4位为1 0x 00 00 00 00 00 00 00 0F

            BitVector32 bits = new BitVector32(0xF);

 

            //(十六进制)0xF等于(二进制)1111等于(十进制)15

            Console.WriteLine(bits.Data);

 

            Console.WriteLine(bits.ToString());

 

接下来就是最重要的位操作了.

BitVector32结构体提供索引器(Indexer)能够直接通过bool对象操作BitVector32结构,索引器參数是int,这个int可不睡第几位的意思(BitArray中的索引器是第几位的意思),而是须要一个位掩码(位屏蔽),BitVector32通过这个位掩码来操作内部比特位.

所以,BitVector32索引器操作事实上就是定义好位掩码,接着取回信息或者赋值就能够了.

案例:

        static void Main(string[] args)

        {

            int mask1 = 1;

            //掩码代表最后一位,二进制表示:0...0001

            int mask2 = 4;

            //掩码代表倒数第三位,二进制表示

posted @ 2017-04-19 13:55  zhchoutai  阅读(179)  评论(0编辑  收藏  举报