位数组

假设须要处理非常多位,就能够使用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("bits1和bits2数组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)操作:0变1,1变0

BitVector32的位操作

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

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

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

//初始化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;

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

C#高级编程五十七天----位数组的更多相关文章

  1. C#编程(五十七)----------位数组

    位数组 如果需要处理很多位,就可以使用BitArray类和BitVector32.BitArray位于命名空间System.Collections中. BitVector32位于命名空间System. ...

  2. C++面向对象高级编程(五)类与类之间的关系

    技术在于交流.沟通,转载请注明出处并保持作品的完整性. 本节主要介绍一下类与类之间的关系,也就是面向对象编程先介绍两个术语 Object Oriented Programming   OOP面向对象编 ...

  3. C#高级编程五十四天----Lookup类和有序字典

    Lookup类 Dictionary<Tkey,TValue>仅仅为每一个键支持一个值.新类Lookup<Tkey,TValue>是.NET3.5中新增的,它类似与Dictio ...

  4. 重学《C#高级编程》(泛型与数组)

    前段时间工作比较忙,就没有写随笔了,现在继续. 前两天重新看了泛型和数组两章,简单说下我自己的收获吧 泛型 我们知道数组是一种批量的数据格式,而泛型其实就是一种自定义的批量数据格式,当数组和C#现有的 ...

  5. Unix环境高级编程(五)进程环境

    本章主要介绍了Unix进程环境,包含main函数是如何被调用的,命令行参数如何传递,存储方式布局,分配存储空间,环境变量,进程终止方法,全局跳转longjmp和setjmp函数及进程的资源限制. ma ...

  6. C#高级编程五十八天----并行集合

    并行集合 对于并行任务,与其相关紧密的就是对一些共享资源,数据结构的并行訪问.常常要做的就是对一些队列进行加锁-解锁,然后运行类似插入,删除等等相互排斥操作. .NET4提供了一些封装好的支持并行操作 ...

  7. C#高级编程五十二天----有序列表

    有序列表 假设须要基于对全部集合排序,就能够使用SortedList<TKey,TValue>类.这个类依照键给元素排序.这个集合中的值和键都能够使用随意类型. 以下的样例创建了一个有序列 ...

  8. 《Android传感器高级编程》

    <Android传感器高级编程> 基本信息 原书名:Professional Android Sensor Programming 原出版社: Wrox 作者: (美)米内特(Greg M ...

  9. (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

随机推荐

  1. vars 变量预解析

    JavaScript中,你可以在函数的任何位置声明多个var语句,并且它们就好像是在函数顶部声明一样发挥作用,这种行为称为 hoisting(悬置/置顶解析/预解析).当你使用了一个变量,然后不久在函 ...

  2. java_方法

    方法 1.1方法概述 在我们的日常生活中,方法可以理解为要做某件事情,而采取的解决办法. 如:小明同学在路边准备坐车来学校学习.这就面临着一件事情(坐车到学校这件事情)需要解决,解决办法呢?可采用坐公 ...

  3. 深度学习基础系列(三)| sigmoid、tanh和relu激活函数的直观解释

    常见的激活函数有sigmoid.tanh和relu三种非线性函数,其数学表达式分别为: sigmoid: y = 1/(1 + e-x) tanh: y = (ex - e-x)/(ex + e-x) ...

  4. Beaglebone Black开发板安装驱动

    Beaglebone Black开发板安装驱动 Beaglebone Black开发板安装驱动,在使用Beaglebone Black开发板子做任何事情之前首先需要安装驱动.下面的内容就了展示在Win ...

  5. PHP函数声明(三)

    /** * 一.任何参数的数量 * func_get_args()//接收一个数组,数组里面包含所有参数 * func_num_args()//取得共有几个参数 * func_get_arg(整数)/ ...

  6. 我的OI生涯 第六章

    开学了,但是我们并没有像一个正常的高二学生一样坐在教室里接受调研考试的洗礼. 暑假作业这种东西早已被甩在一旁,可以想象回去补文化课时该有多么狼狈. 大王给我们制定了周密的计划,每周两次测试,加上蔡老师 ...

  7. 【多重背包小小的优化(。・∀・)ノ゙】BZOJ1531-[POI2005]Bank notes

    [题目大意] Byteotian Bit Bank (BBB) 拥有一套先进的货币系统,这个系统一共有n种面值的硬币,面值分别为b1, b2,..., bn. 但是每种硬币有数量限制,现在我们想要凑出 ...

  8. poj 3744 概率dp+矩阵快速幂

    题意:在一条布满地雷的路上,你现在的起点在1处.在N个点处布有地雷,1<=N<=10.地雷点的坐标范围:[1,100000000]. 每次前进p的概率前进一步,1-p的概率前进1-p步.问 ...

  9. bzoj 3772

    感觉做这种题收获很大. 1.DFS序(广义上)除了用于静态子树操作,也可以用来做点到根的路上某些信息的统计(如点到根的路径上标记了多少个点),如果在加上lca,就可以支持路径的信息查询. 2.树上的可 ...

  10. php操作redis出现不报错就退出

    金乐园项目 php操作redis出现不报错就退出  死活找不出原因是因为下面这句话导致:     原因igbinary扩展没有装上 $options[\Redis::OPT_SERIALIZER] = ...