VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > temp > C#教程 >
  • c#下对BitArray类实现索引器和位操作

制作者:剑锋冷月 单位:无忧统计网,www.51stat.net
 

  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。

  http://www.cnblogs.com/star65225692/archive/2008/04/04/1137477.html



相关教程