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

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

  利用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 = ;
int index = ;
string[] s = new string[];
int[] a = new int[] {,,,, };
BitArray BA = new BitArray(a); Console.WriteLine("BA的大小:" + BA.Count); for(int i=;i<BA.Count;i++)
{
Boolean b = BA.Get(i);
if (b == true)
s[index] = "";
else
s[index] = "";
bits++;
index--;
if (bits % == )
{
bits = ;
index = ;
for (int j = ; j <=; j++)
Console.Write(s[j]);
Console.WriteLine();
} }
Console.ReadKey();
}
}
}

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

BitArray类的使用--(转换二进制数的内部实现过程)的更多相关文章

  1. c#通用配置文件读写类与格式转换(xml,ini,json)

    .NET下编写程序的时候经常会使用到配置文件.配置文件格式通常有xml.ini.json等几种,操作不同类型配置文件需要使用不同的方法,操作较为麻烦.特别是针对同时应用不同格式配置文件的时候,很容易引 ...

  2. XML文件与实体类的互相转换

    XML文件与实体类的互相转换 一.将XML文件反序列化为实体类对象 1. 通常程序的配置信息都保存在程序或者网站的专门的配置文件中(App.config/web.config).但是现在为了演示XML ...

  3. C++中的虚函数(类的向上转换,和向下转换)

    1.C++中的封装时为了代码的模块化,继承是为了代码的重用,而多态则是为了接口的重用. 2.C++中的多态是用虚函数来实现的. 3.子类对象向父类指针的转换(向上转换)是安全的,隐式的,而父类对象向子 ...

  4. DataTable转List<Model>通用类【实体转换辅助类】

    /// <summary> /// DataTable转List<Model>通用类[实体转换辅助类] /// </summary> public class Mo ...

  5. C++基类和派生类之间的转换

    本文讲解内容的前提是派生类继承基类的方式是公有继承,关键字public 以下程序为讲解用例. #include<iostream> using namespace std; class A ...

  6. 实体类与实体DTO类之间的转换

    实体类与实体DTO类之间的转换 实体类与实体DTO类之间的转换 1.通过使用第三方序列化反序列化工具Newtonsoft.Json 2.通过反射实现 3.通过表达式目录树加字典缓存实现 4. 通过表达 ...

  7. Java基本数据类型、包装类与String类之间的转换

    一.基本数据类型与包装类之间的转换: import org.junit.Test; public class MainTest { /** * 基本数据类型与包装类之间的转换 */ @Test pub ...

  8. C# 实现实体类和Xml转换

    一.实体类转换成XML 将实体类转换成XML需要使用XmlSerializer类的Serialize方法,将实体类序列化 public static string XmlSerialize<T& ...

  9. matlab数字图像处理-冈萨雷斯-数据类和图像类之间的转换

    亮度图像 二值图像 属于注释 数据类间的转换 图像类和类型间的转化 把一个double类的任意数组转换成[0,1]的归一化double类数组----->mat2gray 图像类和类型间的转化例题 ...

随机推荐

  1. [BZOJ1117]救火站gas

    Description 给你一棵树,现在要建立一些消防站,有以下要求: 1. 消防站要建立在节点上,每个节点可能建立不只一个消防站. 2. 每个节点应该被一个消防站管理,这个消防站不一定建立在该节点上 ...

  2. swift学习笔记 - swift3.0用GCD实现计时器

    swift3.0之后,GCD的语法发生了翻天覆地的变化,从过去的c语法变成了点语法,下面是变化之后用GCD实现计时器的方法: 先贴代码: // 定义需要计时的时间 var timeCount = 60 ...

  3. 数据结构(十一)B树

    之前的二叉排序树,平衡二叉树都是基于二叉树的实现,但是在搜索过程中,效率和树的深度有关,所以就想到把二叉树改为多叉树,B树和B+树都基于多叉树的实现 多路查找树 B树 定义   应用场景   B+树 ...

  4. Nginx+vsftpd搭建图片服务器

    安装Nginx 参考:http://www.cnblogs.com/idefav2010/p/nginx-concat.html Nginx配置文件 location ~ .*\.(gif|jpg|j ...

  5. MySQL级联删除和级联修改

    1.新建主键table create table demo1_zhujian ( id int primary key auto_increment, name )); 2.新建外键table cre ...

  6. linux环境变量 export命令详解

    由host $ export DVSDK="${HOME}/ti-dvsdk_dm368-evm_xx_xx_xx_xx"引发的问题 1.${HOME}:首先, HOME 是个变量 ...

  7. 最优化问题 Optimization Problems & 动态规划 Dynamic Programming

    2018-01-12 22:50:06 一.优化问题 优化问题用数学的角度来分析就是去求一个函数或者说方程的极大值或者极小值,通常这种优化问题是有约束条件的,所以也被称为约束优化问题. 约束优化问题( ...

  8. python ssh登录

    3. 编写linkssh.py #!/usr/bin/env python# -*- coding: utf-8 -*-# filename: pexpect_test.py'''Created on ...

  9. C++(二十六) — 构造函数、析构函数、对象数组、复制构造函数

    1.构造函数 (1)每个类都要定义它自己的构造函数和析构函数,是类的成员函数. 特点:名称与类名相同:没有返回值:一定是共有函数,可以直接访问类内所有成员函数:可以带默认形参,可以重载: class ...

  10. ionic+cordova 学习开发App(一)

    一.项目所需环境 (一)jdk 1.jdk的安装,必须同时包含Java 和javac [一般安装包中都包含有,可以确定下] (二)node.js 和NPM 1.大多插件和辅助工具都运行在NPm平台上. ...