• BitArray类的使用--(转换二进制数的内部实现过程)


    BitArray类用来处理位集合。

    它和ArrayList十分类似,可以动态调整大小,可以在需要的时候添加二进制位而不用担心数组越界的问题。(所以本质它也是集合里套一个数组,可能是线性数组)

    什么是位集合?

    ----位集合是可以用来有效表示Boolean值的集合。注意:表示True/False的集合,不是0、1集合

    另:

    对常规数的二进制的显示或存储(如1):

    0 0 0 0 0 0 0 1

    而对于在BitArray里的存储,它是如下格式:

    True False False False False False False False

    它的顺序是相反的,而且用布尔值很难便捷读懂,但实际上,我们应当把数值当作1和0这样直观的显示出来,并且顺序也要进行处理

    解决方法:

    BitArray里显示的格式是逆序的,并且每一位都用布尔值显示,我们无法改变BitArray类所用的内部代码,但我们可以编写外部代码,使它能够更加友好的便于理解的常规的方式显示出来。

    举例

    使用BitArray的其中一种构造方法:

    BitArray(Byte[])

    初始化 BitArray 的新实例,该实例包含从指定的字节数组复制的位值位格式

    下面创建一个字节数组,里面包含5个字节型的数值:1和2和3和4和5

     1 using System;
     2 using System.Collections;
     3 using System.Collections.Generic;
     4 using System.Linq;
     5 using System.Text;
     6 using System.Threading.Tasks;
     7 
     8 namespace 二进制数
     9 {
    10     class BinNumber
    11     {
    12         static void Main(string[] args)
    13         {
    14             int bits;
    15             string[] binNumber = new string[8];//
    16             int binary;
    17             byte[] ByteSet = new byte[] { 1, 2, 3, 4, 5 };//定义一个字节型数组,存5个字节型数值:1,2,3,4,5,6
    18             BitArray BitSet = new BitArray(ByteSet);//这里一定要注意,这里的每一个字节型数值是以位的形式每一位用Boolean值逆序存储在BitArray(1字节对应8位)
    19             bits = 0;//bits是计数器,到8了就又归为初始值0;为的是方便知道操作完了一个字节型数值(1字节正好占8位)
    20             binary = 7;//binary是二进制数组下标索引;初始值为7,这是因为BitArray里存储的数据和常规二进制数据的顺序是相反的
    21             Console.WriteLine("BitSet里包含的元素数"+BitSet.Count);//40,因为数据在BitArray里是以位的形式存储的,5个字节型数值,一个字节占8位,所以共占40位!!!不是5!!!
    22             for (int i = 0; i <= BitSet.Count - 1; i++)//遍历40个位,每个位存boolean值True/False
    23             {
    24                 Console.WriteLine("BitSet.Get("+i+")" + BitSet.Get(i));
    25                 if (BitSet.Get(i) == true)
    26                     binNumber[binary] = "1";//如果该位存储的true值,则转成1;
    27                 else
    28                     binNumber[binary] = "0";//如果该位存储的false值,则转成0;
    29                 bits++;      //计数+1
    30                 binary--;    //eg.第8位(下标7)存好,则将下标向左移1位存下一轮将位布尔值转成的二进制0/1
    31 
    32                 if ((bits % 8) == 0)//当计数器为8时,表示一个字节型的数值已经表示完全了
    33                 {
    34                     binary = 7;//将存储字节型数值的二进制形式的String型数组的下标归初始
    35                     bits = 0;
    36                     for(int j=0;j<=7;j++)
    37                         Console.Write(binNumber[j]);
    38                     Console.WriteLine();         
    39                 }
    40             }
    41             Console.ReadKey();
    42         }
    43     }
    44 }

      利用Get方法 可以获取到存储在BitArray里的每一位的位值(True/False)。

    Get(Int32)

    获取 BitArray 中特定位置处的位值。

    BitSet.Get(i):i是整型参数,该方法的返回值是该位所存储的True或False的位值!!!

    所以在获取到该位的位值时需要判断True or False,对True值就写入1,False值就写入0;这样就可以转换成常规的二进制形式0,1形式。


    上面代码的执行结果图


    其实用BitArray它已经把常规的数值按照二进制的位数存储,只是存的内容不是二进制的0,1;而是True ,False.要做的就是把顺序理好,把每一位的Boolean值改成0,1。

    ===========================================================================================================
    另:取整型数组来试一试,整型数组是4字节,32位
    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleApplication2
    {
        class Program
        {
            static void Main(string[] args)
            {
                int bits = 0;
                int index = 31;
                string[] s = new string[32];
                int[] a = new int[] {2,3,2,7, 2147483647};
                BitArray BA = new BitArray(a);
    
                Console.WriteLine("BA的大小:" + BA.Count);
    
                for(int i=0;i<BA.Count;i++)
                {
                   Boolean b = BA.Get(i);
                   if (b == true)
                       s[index] = "1";
                   else
                       s[index] = "0";
                   bits++;
                   index--;
                   if (bits % 32 == 0)
                   {
                       bits = 0;
                       index = 31;
                       for (int j = 0; j <=31; j++)
                           Console.Write(s[j]);
                       Console.WriteLine();
                   }
    
                }
                Console.ReadKey();
             }
        }
    }
    
    

     附:BitArray相关API
    https://msdn.microsoft.com/zh-cn/library/system.collections.bitarray.aspx

  • 相关阅读:
    第一个ExtJS练习(添加用户面板)
    利用高德地图通过给定坐标点画带箭头方向的路径
    安装myeclipse2015 stable 3.0破解之后发生出现SECURITY ALERT:iNTEGRITY CHECK ERROR然后闪退解决方案
    当你的SSM项目中的springmvc.xml发生第一行错误解决方案
    新建maven项目遇到Select an Archetype时没有maven-archetype-webapp处理方法
    XML、HTML、JSON对比
    Mac配置apache2.4.25服务器
    使用HTTP协议访问网络
    android数据持久化存储
    常用git命令
  • 原文地址:https://www.cnblogs.com/Jesuslovesme/p/8447193.html
Copyright © 2020-2023  润新知