3

CreateMask()作用是BitVector32什么?我不明白面具是什么。

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

  // 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

4 回答 4

1

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

您可能想查看 Wikipedia以了解面具是什么。

简而言之:掩码是您感兴趣的位的 1 和其他位的 0 数组形式的模式。

如果您有类似 01010 的内容,并且您有兴趣获取最后 3 位,则您的掩码看起来像 00111。然后,当您对 01010 和 00111 执行按位与时,您将获得最后三位 (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。

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

于 2009-09-15T11:02:16.763 回答
1

BitVector32.CreateMask()是对左移运算符 ( <<) 的替代,在大多数情况下会导致乘以 2(左移不是循环的,因此您可能会开始丢失数字,此处解释了更多内容)

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}

于 2011-09-28T10:37:50.770 回答
0

我偶然发现了这个问题,试图找出究竟CreateMask是什么。我不觉得当前的答案为我回答了这个问题。经过一些阅读和实验,我想分享我的发现:

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

因为 << 是一个二元运算符,而 CreateMask 只接受一个参数,所以我想补充一点,BitVector32.CreateMask(x)它等同于x << 1.

边箱

但是,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 << 1 将仅返回 0。

乘以 2

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

无论如何,您可能不应该将它用于此目的。据我了解,当您使用 BitVector32 时,您真的应该只将其视为 32 位序列。他们将整数与 BitVector32 结合使用的事实可能只是因为它很方便。

CreateMask 什么时候有用?

老实说,我不知道。从文档和函数参数的名称“previous”看来,他们打算以某种顺序使用它:“使用 CreateMask() 来创建系列中的第一个掩码和 CreateMask(int) 为所有随后的面具。”。

但是,在代码示例中,他们使用它为前 5 位创建掩码,随后对这些位执行一些操作。我无法想象他们希望您连续编写 32 次调用 CreateMask 以便能够使用左侧附近的位做一些事情。

于 2012-07-11T16:32:38.740 回答
0

检查此其他帖子链接文本。而且,CreateMask不会返回给定的数字乘以 2。 CreateMask 基于 32 位字中的特定位置(这是您传递的参数)创建一个位掩码,当您是谈论一位(标志)。

于 2010-10-20T20:08:07.637 回答