博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
学用 ASP.Net 之 System.Collections.Specialized.BitVector32 结构
阅读量:6981 次
发布时间:2019-06-27

本文共 6828 字,大约阅读时间需要 22 分钟。

  hot3.png

BitVector32 结构只提供 32 位大小的储存空间(同 Int32), 通过它可以快速存取布尔值或小整数(譬如 7 以内或 15 以内的小整数等等).

主要成员:

/* 属性 */Data; //其 32 位值的整数表示, 只读; 可以通过它持久记录 BitVector32 的状态/* 静态方法 */BitVector32.CreateMask();    //建立 MaskBitVector32.CreateSection(); //建立 BitVector32.SectionBitVector32.ToString();      //返回指定 BitVector32 对象的位状态字符串/* 方法 */ToString(); //返回位状态字符串/* 与之相关的结构 BitVector32.Section 也有两个属性 */Mask;   //位掩码Offset; //偏移

构建方法:

protected void Button1_Click(object sender, EventArgs e){    BitVector32 bv1 = new BitVector32();           //同 new BitVector32(0);    BitVector32 bv2 = new BitVector32(0);          //置 32 个位全为 0    BitVector32 bv3 = new BitVector32(0x0000FF0F); //使用一个 int 值的 "位"    BitVector32 bv4 = new BitVector32(bv3);        //使用另一个 BitVector32 的数据构建    BitVector32 bv5 = new BitVector32(-1);         //这样可全置位    string s1 = bv1.ToString(); //BitVector32{00000000000000000000000000000000}    string s2 = bv2.ToString(); //BitVector32{00000000000000000000000000000000}    string s3 = bv3.ToString(); //BitVector32{00000000000000001111111100001111}    string s4 = bv4.ToString(); //BitVector32{00000000000000001111111100001111}    string s5 = bv5.ToString(); //BitVector32{11111111111111111111111111111111}    TextBox1.Text = s1 + "\n" + s2 + "\n" + s3 + "\n" + s4 + "\n" + s5;}

数组式访问:

//假如用 BitVector32 储存一个数字的话, 它能储存 UInt32.MaxValue 个.protected void Button1_Click(object sender, EventArgs e){    BitVector32 bv = new BitVector32(0);    bv[1] = true;    string s1 = bv.ToString();    //BitVector32{00000000000000000000000000000001}    bv[-1] = false; bv[2] = true; //全部清空后重新赋值    string s2 = bv.ToString();    //BitVector32{00000000000000000000000000000010}    bv[-1] = false; bv[3] = true; //BitVector32{00000000000000000000000000000011}    string s3 = bv.ToString();    bv[-1] = false; bv[4] = true; //BitVector32{00000000000000000000000000000100}    string s4 = bv.ToString();    bv[-1] = false; bv[5] = true; //BitVector32{00000000000000000000000000000101}    string s5 = bv.ToString();    bv[-1] = false; bv[6] = true; //BitVector32{00000000000000000000000000000110}    string s6 = bv.ToString();    bv[-1] = false; bv[7] = true; //BitVector32{00000000000000000000000000000111}    string s7 = bv.ToString();    bv[-1] = false; bv[Int32.MaxValue] = true; //BitVector32{01111111111111111111111111111111}    string s8 = bv.ToString();    TextBox1.Text = s1 + "\n" + s2 + "\n" + s3 + "\n" + s4 + "\n" + s5 + "\n" + s6 + "\n" + s7 + "\n" + s8;}

分别访问每一个位:

//这要通过位掩码(Mask)访问protected void Button1_Click(object sender, EventArgs e){    BitVector32 bv = new BitVector32(0);    int n1 = (int)Math.Pow(2, 0);    int n2 = (int)Math.Pow(2, 1);    int n3 = (int)Math.Pow(2, 2);    int n4 = (int)Math.Pow(2, 3);    int n5 = (int)Math.Pow(2, 4);    int n32 = (int)Math.Pow(2, 31);    bv[n3] = true;    string s1 = bv.ToString(); //BitVector32{00000000000000000000000000000100}    bv[n1] = true;    bv[n2] = true;    bv[n3] = true;    bv[n4] = true;    bv[n5] = true;    bv[n32] = true;    string s2 = bv.ToString(); //BitVector32{10000000000000000000000000011111}    bv[-1] = true; //全置位    bv[n1] = false;    bv[n2] = false;    bv[n3] = false;    bv[n4] = false;    bv[n5] = false;    bv[n32] = false;    string s3 = bv.ToString(); //BitVector32{01111111111111111111111111100000}    TextBox1.Text = s1 + "\n" + s2 + "\n" + s3;}

BitVector32.CreateMask():

//这是设计者提供的访问 BitVector32 位的方式protected void Button1_Click(object sender, EventArgs e){    BitVector32 bv = new BitVector32(0);    int mk1 = BitVector32.CreateMask();    //建立第一个 Mask, 或写作 BitVector32.CreateMask(0);    int mk2 = BitVector32.CreateMask(mk1); //在 mk1 后建立 mk2    int mk3 = BitVector32.CreateMask(mk2); //在 mk2 后建立 mk3    int mk4 = BitVector32.CreateMask(mk3); //    int mk5 = BitVector32.CreateMask(mk4); //    //mk1 .. mk5 的值分别会是: 1、2、4、8、16    bv[mk3] = true;    string s1 = bv.ToString(); //BitVector32{00000000000000000000000000000100}    bv[mk1] = true;    bv[mk2] = true;    bv[mk3] = true;    bv[mk4] = true;    bv[mk5] = true;    string s2 = bv.ToString(); //BitVector32{00000000000000000000000000011111}    bv[-1] = true; //全置位    bv[mk1 | mk2 | mk3 | mk4 | mk5] = false; //可以使用 "|" 或 "+" 同时给几个 Mask 赋值    string s3 = bv.ToString(); //BitVector32{11111111111111111111111111100000}    TextBox1.Text = s1 + "\n" + s2 + "\n" + s3;}

BitVector32.CreateSection():

//假如要使用 0..7 八个数字, 只需要二进制的 3 个位就可以了;//BitVector32.CreateSection(n) 就是在 BitVector32 中建立能放下 0..n 个小整数的 Section(片段)protected void Button1_Click(object sender, EventArgs e){    BitVector32 bv = new BitVector32(0);    BitVector32.Section sec = BitVector32.CreateSection(7);    string s0, s1, s2, s3, s4, s5, s6, s7;    bv[sec] = 0; s0 = bv.ToString(); //BitVector32{00000000000000000000000000000000}    bv[sec] = 1; s1 = bv.ToString(); //BitVector32{00000000000000000000000000000001}    bv[sec] = 2; s2 = bv.ToString(); //BitVector32{00000000000000000000000000000010}    bv[sec] = 3; s3 = bv.ToString(); //BitVector32{00000000000000000000000000000011}    bv[sec] = 4; s4 = bv.ToString(); //BitVector32{00000000000000000000000000000100}    bv[sec] = 5; s5 = bv.ToString(); //BitVector32{00000000000000000000000000000101}    bv[sec] = 6; s6 = bv.ToString(); //BitVector32{00000000000000000000000000000110}    bv[sec] = 7; s7 = bv.ToString(); //BitVector32{00000000000000000000000000000111}    TextBox1.Text = s0 + "\n" + s1 + "\n" + s2 + "\n" + s3 + "\n" + s4 + "\n" + s5 + "\n" + s6 + "\n" + s7;}

建立多个 Section:

//使用多个 Section 时, 和 BitVector32.CreateMask() 的理念一样, 是基于一个建另一个, 挨着来.protected void Button1_Click(object sender, EventArgs e){    BitVector32 bv = new BitVector32(0);    BitVector32.Section secX = BitVector32.CreateSection(15);       //第一个 Section, 可储存 0..15    BitVector32.Section secY = BitVector32.CreateSection(7, secX);  //secX 之后的 Section, 可储存 0..7    BitVector32.Section secZ = BitVector32.CreateSection(15, secY); //secY 之后的 Section, 可储存 0..15    //此时的内存占用图: 000000000000000000000ZZZZYYYXXXX    bv[secX] = 15;    bv[secY] = 0;    bv[secZ] = 15;    string s1 = bv.ToString(); //BitVector32{00000000000000000000011110001111}    bv[secX] = 1;    bv[secY] = 1;    bv[secZ] = 1;    string s2 = bv.ToString(); //BitVector32{00000000000000000000000010010001}    TextBox1.Text = s1 + "\n" + s2;}

BitVector32.CreateSection() 返回的 BitVector32.Section 也是个结构体:

protected void Button1_Click(object sender, EventArgs e){    BitVector32 bv = new BitVector32(0);    BitVector32.Section secX = BitVector32.CreateSection(15);          BitVector32.Section secY = BitVector32.CreateSection(7, secX);     BitVector32.Section secZ = BitVector32.CreateSection(15, secY);    TextBox1.Text  = string.Format("{0}, {1}, {2}\n", secX.Mask, secY.Mask, secZ.Mask);       //15, 7, 15    TextBox1.Text += string.Format("{0}, {1}, {2}\n", secX.Offset, secY.Offset, secZ.Offset); //0, 4, 7}

转载于:https://my.oschina.net/hermer/blog/319380

你可能感兴趣的文章
Android帧缓冲区(Frame Buffer)硬件抽象层(HAL)模块Gralloc的实现原理分析(1)...
查看>>
Javascript中的字符串链接和Array.join()方法时间效率对比
查看>>
内部毕业学生对老男孩教育的客观评价
查看>>
SQL Server 表和索引存储结构
查看>>
Linux监控之系统性能
查看>>
CIO要更有担当
查看>>
为什么用Immutable.js代替普通js对象?
查看>>
马云:现实版岳不群?
查看>>
IT从花钱到赚钱——惠普IT转型记
查看>>
Ossim系统常见测试方法
查看>>
创业那些年,我们一起走过的坑
查看>>
瞎扯赚大钱的逻辑
查看>>
"人肉"云-【软件和信息服务】2014.02
查看>>
华为5.3亿美元收购赛门铁克在合资公司中股权
查看>>
Asp.net mvc4用JQuery插件实现异步上传
查看>>
使用组策略控制可移动存储访问
查看>>
监控平台实施方案
查看>>
RSA2012系列(2):HP谈他们的安全智能平台
查看>>
统帅转型:轻时尚时代挺进年轻领地
查看>>
Photoshop制作一只可爱的卡通小鸟
查看>>