BitVector32的CreateMask函数是用来做什么的?

3

BitVector32CreateMask() 函数是做什么的?我不明白什么是掩码。

我想了解以下代码行。CreateMask() 只是将位设置为 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个回答

2
它返回一个掩码,您可以用它更轻松地检索感兴趣的位。
您可能想要查看维基百科以了解掩码是什么。
简而言之:掩码是一种模式,形式为1和0的数组,其中1表示您感兴趣的位,0表示其他位。
例如,如果您有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。
注意:第一位是最不重要的位,即最右边的位。

口罩是如何创建的?例如,myBit3如何指定第三位? - Sunder

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}


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。除了上述两种特殊情况,当左起第二个比特位与最左边的比特位不同时,它会有所不同。整数是带符号的,因此最左边的比特位表示符号。在这种情况下,符号会取相反值。例如,CreateMask(-1)(或11111111111111111111111111111111)的结果为-2(或11111111111111111111111111111110),但CreateMask(int.MaxValue)(或01111111111111111111111111111111)的结果也为-2。

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

CreateMask何时有用?

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

然而,在代码示例中,他们使用它来创建前5位的掩码,随后对这些位进行一些操作。我无法想象他们希望你连续写32个CreateMask调用来能够处理靠近左侧的位。


0

请查看另一篇文章链接文本。 此外,CreateMask不会返回给定数字乘以2。 CreateMask基于32位字中的特定位置(这是您传递的参数)创建位掩码,通常情况下当您谈论单个位(标志)时,该位置为x^2。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接