程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#下的BitArray類:實現索引器和位操作

C#下的BitArray類:實現索引器和位操作

編輯:關於C語言

System.Collections命名空間下的BitArray相當於一個bool類型的數組bool[]。MSDN用 BitArray做例子實現了一個索引器,今天研究了一下這個例子,對原來的實現做了一些改變 ,將>> 5操作變成了mod 32,敝人以為這樣看起來會更直觀。

代碼如下:

public class MyBitArray
  {
    private int[] m_Bits;
    private int m_Length;
    public MyBitArray(int length)
    {
      //Comment 1
      m_Length = (length - 1) / 32 + 1; 
      m_Bits = new int[m_Length];
    }
    public bool this[int index]
    {
      //Comment 2
      get { return (m_Bits[index / 32] & 1 << index) != 0; }
       set
      {
        if (value)
          m_Bits[index / 32] |= 1 << index;
        else
          m_Bits[index / 32] &= ~(1 << index);
      }
    }
  }

Comment 1 :1個int占用4個字節,可以存儲32個bit值。所以實際所需的int數組的長度 是所傳入length的1/32。length -1 是考慮到邊界值32,(32-1)/32 + 1 =1,否則得到的結 果是2,而此時只需1個int長度的內存即可。而對邊界值0,(0-1)/32 + 1 = 1,也是沒有問 題的。

Comment 2 :BitArray中的一系列bit值,可以看做被分段存儲在了int元素中,index/32 取出了index對應的bit值所在的int元素。再將1移動到合適的位上,進行與/或操作。看起來 有點類似內存訪問中段和頁的概念。

關於索引器:索引器與property最大的區別在於,property只有set方法帶有參數,而 indexer的get和set方法都帶有默認參數index。另外property可以是static的,索引器當然 不行。詳細比較請看這裡。

關於位操作:通常,當指定移動的位數溢出的時候,位移操作會自動對移動位數取模。這 就是為什麼上面的set方法中1 << index能將1移動到正確位置的原因。

舉例,8 >> 33; 相當於8 >> 1, 結果是4,而不是0。

1 << 32; 相當於1 << 0, 結果還是1。

有意思的是,變量類型為byte或short或int的時候,CLR取模的除數都是32,而不是隨數 據類型的長度變化。比如:

short b = 1; b <<= 16; 

得到的結果為0. 此時CLR並非對16取模。

但如果數據被定義為long,則取模的除數會自動變成64。

long l = 1; l <<= 32; 得到的值是4294967296,即2^32。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved