BitVector32的CreateMask功能有什么作用?

时间:2009-09-15 11:00:04

标签: c# .net bitvector

CreateMask()BitVector32功能有什么作用? 我没有得到面具是什么。

想了解以下几行代码。创建掩码只是将位设置为true吗?

  // Creates and initializes a BitVector32 with all bit flags set to FALSE.
  BitVector32 myBV = new BitVector32( 0 );

  // Creates masks to isolate each of the first five bit flags.
  int myBit1 = BitVector32.CreateMask();
  int myBit2 = BitVector32.CreateMask( myBit1 );
  int myBit3 = BitVector32.CreateMask( myBit2 );
  int myBit4 = BitVector32.CreateMask( myBit3 );
  int myBit5 = BitVector32.CreateMask( myBit4 );

  // Sets the alternating bits to TRUE.
  Console.WriteLine( "Setting alternating bits to TRUE:" );
  Console.WriteLine( "   Initial:         {0}", myBV.ToString() );
  myBV[myBit1] = true;
  Console.WriteLine( "   myBit1 = TRUE:   {0}", myBV.ToString() );
  myBV[myBit3] = true;
  Console.WriteLine( "   myBit3 = TRUE:   {0}", myBV.ToString() );
  myBV[myBit5] = true;
  Console.WriteLine( "   myBit5 = TRUE:   {0}", myBV.ToString() );

这有什么实际应用?

4 个答案:

答案 0 :(得分:1)

它返回一个掩码,您可以使用它来更容易地检索有趣的位。

您可能希望check out Wikipedia获取掩码。

简而言之:掩码是一个1s数组形式的模式,用于您感兴趣的位,0s用于其他位。

如果您有像01010这样的东西并且您有兴趣获得最后3位,那么您的掩码看起来就像00111.然后,当您在01010和00111上执行按位AND时,您将获得最后三位(00010),因为如果两个位都置位,则AND仅为1,并且掩码中没有设置前三个旁边的位。

一个例子可能更容易理解:

BitVector32.CreateMask() => 1 (binary 1)
BitVector32.CreateMask(1) => 2 (binary 10)
BitVector32.CreateMask(2) => 4 (binary 100)
BitVector32.CreateMask(4) => 8 (binary 1000)

CreateMask(int)返回给定的数字乘以2.

注意:第一位是最低有效位,即最右边的位。

答案 1 :(得分:1)

BitVector32.CreateMask()是左移位运算符(<<)的替换,在大多数情况下会导致乘以2(左移不是循环,所以你可以开始丢失数字,更多解释{ {3}})

BitVector32 vector = new BitVector32();
int bit1 = BitVector32.CreateMask();
int bit2 = BitVector32.CreateMask(bit1);
int bit3 = 1 << 2;
int bit5 = 1 << 4;

Console.WriteLine(vector.ToString());
vector[bit1 | bit2 | bit3 | bit5] = true;
Console.WriteLine(vector.ToString());

输出:

  

BitVector32 {00000000000000000000000000000000}   BitVector32 {00000000000000000000000000010111}

答案 2 :(得分:0)

查看另一篇帖子link text。 而且,CreateMask 返回给定的数字乘以2。 CreateMask根据32位字中的特定位置(即您传递的参数)创建位掩码,当您谈论单个位(标志)时,通常为x ^ 2.

答案 3 :(得分:0)

我偶然发现了这个问题,试图找出CreateMask究竟做了什么。我觉得目前的答案对我来说没有回答这个问题。经过一些阅读和实验,我想分享我的发现:

基本上Maksymilian所说的是almast正确的:“BitVector32.CreateMask是左移位运算符(&lt;&lt;)的替代,在大多数情况下会导致乘以2”。

因为&lt;&lt;是一个二元运算符,CreateMask只接受一个参数,我想补充说BitVector32.CreateMask(x)等同于x << 1

Bordercases

但是,对于两个边境案件,BitVector32.CreateMask(x)x << 1不等效:

  1. BitVector32.CreateMask(int.MinValue)
    将抛出InvalidOperationException。 int.MinValue对应10000000000000000000000000000000。这看起来有点奇怪。特别是考虑到每个其他值,1为最左边的位(即负数)工作正常。相反:int.MinValue << 1不会抛出异常而只返回0.

  2. 致电BitVector32.CreateMask(0)(或BitVector32.CreateMask())时。这将返回1
    (即00000000000000000000000000000000变为00000000000000000000000000000001),
    而0 <&lt;&lt; 1只会返回0.

  3. 乘以2

    CreateMask几乎总是等于乘以2.除了上述两种特殊情况之外,当左边的第二位与最左边的位不同时,它会有所不同。 int是有符号的,因此最左边的位表示符号。在那种情况下,标志被翻转。例如。 CreateMask(-1)(或11111111111111111111111111111111)会产生-2(或11111111111111111111111111111110),但CreateMask(int.MaxValue)(或01111111111111111111111111111111)也会产生-2。

    无论如何,您可能不应该将它用于此目的。据我所知,当你使用BitVector32时,你真的应该只考虑它是一个32位的序列。他们将int与BitVector32结合使用的事实可能只是因为它很方便。

    CreateMask什么时候有用?

    老实说,我不知道。它似乎从documentation和函数参数的名称“previous”开始,它们打算以某种顺序使用它:“使用CreateMask()创建一个系列中的第一个掩码和CreateMask( int)用于所有后续掩码。“

    但是,在代码示例中,它们使用它来创建前5位的掩码,然后对这些位执行某些操作。我无法想象他们希望你连续写入32个调用给CreateMask,以便能够用左边的位做一些事情。