C#集合之位数组
如果需要处理的数字有许多位,就可以使用BitArray类和BitVector32结构。BitArray类位于System.Collection,BitVector32结构位于System.Collection.Specialized。
这两种类型最重要的区别是,BitArray类可以重新设置大小,如果事先不知道需要的位数,就可以使用BitArray类。BitVector32结构是基于栈的,因此比较快。BitVector32结构仅包含32位,它们存储在一个整数中。
1.BitArray类
BitArray类是一个引用类型,它包含一个int数组,其中每32位使用一个新整数。
示例:
static void BitArrayDemo()
{
var bits1 = new BitArray();
bits1.SetAll(true);
bits1.Set(, false);
bits1[] = false;
bits1[] = false;
Console.Write("initialized: ");
DisplayBits(bits1);
Console.WriteLine();
//int i = Convert.ToInt32(bits1); DisplayBits(bits1);
bits1.Not();
Console.Write(" not ");
DisplayBits(bits1);
Console.WriteLine(); var bits2 = new BitArray(bits1);
bits2[] = true;
bits2[] = false;
bits2[] = true;
DisplayBits(bits1);
Console.Write(" or ");
DisplayBits(bits2);
Console.Write(" : ");
bits1.Or(bits2);
DisplayBits(bits1);
Console.WriteLine(); DisplayBits(bits2);
Console.Write(" and ");
DisplayBits(bits1);
Console.Write(" : ");
bits2.And(bits1);
DisplayBits(bits2);
Console.WriteLine(); DisplayBits(bits1);
Console.Write(" xor ");
DisplayBits(bits2);
bits1.Xor(bits2);
Console.Write(" : ");
DisplayBits(bits1);
Console.WriteLine();
} static void DisplayBits(BitArray bits)
{
foreach (bool bit in bits)
{
Console.Write(bit ? : );
}
}
2.BitVector32结构
如果事先知道需要的位数,就可以使用BitVector32结构代替BitArry类。BitVector32结构效率较高,因为它是一个值类型,在整数栈上存储位。一个整数可以存储32位。如果需要更多的位,可以使用多个BitVector32值或BitArray类。
//对CreateMask方法的第一个调用来访问第一位的一个掩码
//调用CreateMask后,bit1被设置为1。再次调用CreateMask方法,把第一个掩码作为参数传递给CreateMask方法,返回来第二位的一个掩码(是2) var bits1 = new BitVector32();
int bit1 = BitVector32.CreateMask(); //
int bit2 = BitVector32.CreateMask(bit1); //
int bit3 = BitVector32.CreateMask(bit2); //
int bit4 = BitVector32.CreateMask(bit3); //
int bit5 = BitVector32.CreateMask(bit4); // bits1[bit1] = true;
bits1[bit2] = false;
bits1[bit3] = true;
bits1[bit4] = true;
Console.WriteLine(bits1);
输出:
//除了用CreateMask方法创建掩码之外,还可以自己定义掩码,也可以一次设置多位。
//十六进制abcdef与二进制1010 1011 1100 1101 1110 1111相同
bits1[0xabcdef] = true;
Console.WriteLine(bits1);
输出:
//也可以把32位分别放在不同的片段中
bits1[0xabcdef] = true;
Console.WriteLine(bits1); int received = 0x79abcdef; var bits2 = new BitVector32(received);
Console.WriteLine(bits2);
//创建6个片段。第一个片段需要12位,有16进制0xfff定义。
//第一次调用CreateSection方法直接受0xfff,为最前面的12位分配内存。
//第二次调用CreateSection方法,将第一个片段和偏移量传递
BitVector32.Section sectionA = BitVector32.CreateSection(0xfff);
BitVector32.Section sectionB = BitVector32.CreateSection(0xff, sectionA);
BitVector32.Section sectionC = BitVector32.CreateSection(0xf, sectionB);
BitVector32.Section sectionD = BitVector32.CreateSection(0x7, sectionC);
BitVector32.Section sectionE = BitVector32.CreateSection(0x7, sectionD);
BitVector32.Section sectionF = BitVector32.CreateSection(0x3, sectionE);
//bits2[sectionA],把一个BitVector32.Section类型的值传递给BitVector32结构的索引器,会返回一个int。IntToBinaryString方法将这个int表示
Console.WriteLine("Section A: " + IntToBinaryString(bits2[sectionA], true));
Console.WriteLine("Section B: " + IntToBinaryString(bits2[sectionB], true));
Console.WriteLine("Section C: " + IntToBinaryString(bits2[sectionC], true));
Console.WriteLine("Section D: " + IntToBinaryString(bits2[sectionD], true));
Console.WriteLine("Section E: " + IntToBinaryString(bits2[sectionE], true));
Console.WriteLine("Section F: " + IntToBinaryString(bits2[sectionF], true)); static string IntToBinaryString(int bits, bool removeTrailingZero)
{
var sb = new StringBuilder(); for (int i = ; i < ; i++)
{
if ((bits & 0x80000000) != )
{
sb.Append("");
}
else
{
sb.Append("");
}
bits = bits << ;
}
string s = sb.ToString();
if (removeTrailingZero)
return s.TrimStart('');
else
return s;
}
输出:
C#集合之位数组的更多相关文章
- [翻译] Linux 内核中的位数组和位操作
目录 Linux 内核里的数据结构 原文链接与说明 Linux 内核中的位数组和位操作 位数组声明 体系结构特定的位操作 通用位操作 链接 Linux 内核里的数据结构 原文链接与说明 https:/ ...
- C#编程(五十七)----------位数组
位数组 如果需要处理很多位,就可以使用BitArray类和BitVector32.BitArray位于命名空间System.Collections中. BitVector32位于命名空间System. ...
- C#高级编程五十七天----位数组
位数组 假设须要处理非常多位,就能够使用BitArray类和BitVector32.BitArray位于命名空间System.Collections中. BitVector32位于命名空间System ...
- 用C语言关于学生管理系统的几种实现方法(一位数组,二维数组,指针,结构体)
一位数组: #include <stdio.h> #include<string.h> #define N 5 void luru(float s[],int n); void ...
- C++ 出现bug :二位数组的操作运算,求非对角线的元素的和
编写一个通用程序,求出二位数组(行数和列数必须相等)的非对角线的元素之和,试建立类MATRIX完成上述功能 #include<iostream> using namespace std; ...
- 如何实现简单的位数组(bit array)(转)
源:如何实现简单的位数组(bit array) 在 comp.lang.c 上面看到一则不错的 FAQ,<How can I implement sets or arrays of bits?& ...
- ArrayList集合、String[]数组、String字符串
数组初始化时候必须指定长度,而ArrayList是动态数组,可以根据实际内容改变 //声明stsArr数组并初始化 String[] strArr = new String[]{ "aaa& ...
- List集合与Array数组之间的互相转换
1.数组转换成List集合 采用java中集合自带的asList()方法就可以完成转换了 String[] array = new String[] {"zhu", "w ...
- PHP 之二位数组根据某个字段排序封装
/** * @param $array * @param $keys * @param string $sort * @return array */ function arraySort($arra ...
随机推荐
- vim全局替换命令-乾颐堂
语法为 :[addr]s/源字符串/目的字符串/[option] 全局替换命令为::%s/源字符串/目的字符串/g [addr] 表示检索范围,省略时表示当前行. 如:“1,20” :表示从第1行到2 ...
- jquery Ajax跨域请求
这是jquery api文档对跨域请求的解析:如果获取的数据文件存放在远程服务器上(域名不同,也就是跨域获取数据),则需要使用JSONP类型.使用这种类型的话,会创建一个查询字符串参数 callbac ...
- java中的集合类总结
在使用Java的时候,我们都会遇到使用集合(Collection)的时候,但是Java API提供了多种集合的实现,我在使用和面试的时候频 频遇到这样的“抉择” . :)(主要还是面试的时候) 久而久 ...
- 1700 Crossing River
题目链接: http://poj.org/problem?id=1700 1. 当1个人时: 直接过河 t[0]. 2. 当2个人时: 时间为较慢的那个 t[1]. 3. 当3个人时: 时间为 t[0 ...
- 42 :809*x=800*x+9*x+1
题目:809*x=800*x+9*x+1(去掉最后的1有解)其中x代表的两位数,8*x的结果为两位数,9*x的结果为3位数.求x代表的两位数,及809*x后的结果(两种方法实现) public cla ...
- 关于利用word发布文章到博客
目前大部分的博客作者在写博客这件事情上都会遇到以下3个痛点:1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.2.发布到博客或公众号平台 ...
- 编写高质量代码改善C#程序的157个建议——建议88:并行并不总是速度更快
建议88:并行并不总是速度更快 并行所带来的后台任务及任务的管理,都会带来一定的开销,如果一项工作本来就能很快完成,或者说循环体很小,那么并行的速度也许会比非并行要慢. 看这样一个例子,我们比较在同步 ...
- 编写高质量代码改善C#程序的157个建议——建议69:应使用finally避免资源泄漏
建议69:应使用finally避免资源泄漏 除非发生让应用程序中断的异常,否则finally总是会先于return执行.finally的这个语言特性决定了资源释放的最佳位置就是在finally块中:另 ...
- Delphi XE8 iOS与Android移动应用开发(APP开发)教程[完整中文版]
https://item.taobao.com/item.htm?id=536584650957&toSite=main
- [LeetCode 题解]: pow(x,n)
前言 [LeetCode 题解]系列传送门: http://www.cnblogs.com/double-win/category/573499.html 1.题目描述 Implement po ...