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}