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("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#高级编程五十七天----位数组的更多相关文章
- C#编程(五十七)----------位数组
位数组 如果需要处理很多位,就可以使用BitArray类和BitVector32.BitArray位于命名空间System.Collections中. BitVector32位于命名空间System. ...
- C++面向对象高级编程(五)类与类之间的关系
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 本节主要介绍一下类与类之间的关系,也就是面向对象编程先介绍两个术语 Object Oriented Programming OOP面向对象编 ...
- C#高级编程五十四天----Lookup类和有序字典
Lookup类 Dictionary<Tkey,TValue>仅仅为每一个键支持一个值.新类Lookup<Tkey,TValue>是.NET3.5中新增的,它类似与Dictio ...
- 重学《C#高级编程》(泛型与数组)
前段时间工作比较忙,就没有写随笔了,现在继续. 前两天重新看了泛型和数组两章,简单说下我自己的收获吧 泛型 我们知道数组是一种批量的数据格式,而泛型其实就是一种自定义的批量数据格式,当数组和C#现有的 ...
- Unix环境高级编程(五)进程环境
本章主要介绍了Unix进程环境,包含main函数是如何被调用的,命令行参数如何传递,存储方式布局,分配存储空间,环境变量,进程终止方法,全局跳转longjmp和setjmp函数及进程的资源限制. ma ...
- C#高级编程五十八天----并行集合
并行集合 对于并行任务,与其相关紧密的就是对一些共享资源,数据结构的并行訪问.常常要做的就是对一些队列进行加锁-解锁,然后运行类似插入,删除等等相互排斥操作. .NET4提供了一些封装好的支持并行操作 ...
- C#高级编程五十二天----有序列表
有序列表 假设须要基于对全部集合排序,就能够使用SortedList<TKey,TValue>类.这个类依照键给元素排序.这个集合中的值和键都能够使用随意类型. 以下的样例创建了一个有序列 ...
- 《Android传感器高级编程》
<Android传感器高级编程> 基本信息 原书名:Professional Android Sensor Programming 原出版社: Wrox 作者: (美)米内特(Greg M ...
- (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
随机推荐
- Laravel 之父:让 Laravel、Symfony、 Zend 来一场公平的性能测试
网上充斥着各式各样的 PHP 框架性能对比的文章.然而,他们总是把“苹果”和“橘子”做对比(看上去有点儿像,都是圆的,但其实不是一码事).这次,我将着重对 Laravel.Symfony 和 Zend ...
- EOJ 3261 分词
字典树,$dp$. 记录$dp[i]$为以$i$为结尾获得的最大价值.枚举结尾一段是哪个单词,更新最大值.可以将字典中单词倒着建一棵字典树. 这题数据有点不严谨. 下面这组数据答案应该是负的. 3 a ...
- 请画出Servlet 2.2以上Web Application的基本目录结构
Java web工程下的webapp或WebContent就是工程的发布文件夹,发布时会把该文件夹发布到tomcat的webapps里. 一个web应用必须要有的目录文件如下: webapp/WebC ...
- python 写一个贪吃蛇游戏
#!usr/bin/python #-*- coding:utf-8 -*- import random import curses s = curses.initscr() curses.curs_ ...
- 【BZOJ 1221】 1221: [HNOI2001] 软件开发 (最小费用流)
1221: [HNOI2001] 软件开发 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1581 Solved: 891 Description ...
- 【BZOJ 3229】 3229: [Sdoi2008]石子合并 (GarsiaWachs算法)
3229: [Sdoi2008]石子合并 Description 在一个操场上摆放着一排N堆石子.现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合 ...
- 「SCOI2015」情报传递
「SCOI2015」情报传递 题目描述 奈特公司是一个巨大的情报公司,它有着庞大的情报网络.情报网络中共有 \(n\) 名情报员.每名情报员可能有若干名(可能没有)下线,除 \(1\) 名大头目外其余 ...
- hihoCoder #1695 公平分队II
题目大意 Alice 和 Bob 在玩一个游戏.Alice 将 $1$ 到 $2n$ 这 $2n$ 个整数分成两组,每组 $n$ 个.Bob 从中选一组,剩下一组归 Alice.Alice 可以与 B ...
- 最短路:我的理解--Dijkstra算法
最短路径:Dijkstra算法 用来计算从一个点到其他所有点的最短路径的算法,是一种单源最短路径算法.也就是说,只能计算起点只有一个的情况. Dijkstra的时间复杂度是O (N2),它不能处理存在 ...
- [转]Intent和PendingIntent的区别
intent英文意思是意图,pending表示即将发生或来临的事情. PendingIntent这个类用于处理即将发生的事情.比如在通知Notification中用于跳转页面,但不是马上跳转. Int ...