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() );
这有什么实际应用?
答案 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
。
但是,对于两个边境案件,BitVector32.CreateMask(x)
与x << 1
不等效:
BitVector32.CreateMask(int.MinValue)
:
将抛出InvalidOperationException。 int.MinValue
对应10000000000000000000000000000000
。这看起来有点奇怪。特别是考虑到每个其他值,1为最左边的位(即负数)工作正常。相反:int.MinValue << 1
不会抛出异常而只返回0.
致电BitVector32.CreateMask(0)
(或BitVector32.CreateMask()
)时。这将返回1
(即00000000000000000000000000000000
变为00000000000000000000000000000001
),
而0 <&lt;&lt; 1只会返回0.
CreateMask几乎总是等于乘以2.除了上述两种特殊情况之外,当左边的第二位与最左边的位不同时,它会有所不同。 int是有符号的,因此最左边的位表示符号。在那种情况下,标志被翻转。例如。 CreateMask(-1)
(或11111111111111111111111111111111
)会产生-2(或11111111111111111111111111111110
),但CreateMask(int.MaxValue)
(或01111111111111111111111111111111
)也会产生-2。
无论如何,您可能不应该将它用于此目的。据我所知,当你使用BitVector32时,你真的应该只考虑它是一个32位的序列。他们将int与BitVector32结合使用的事实可能只是因为它很方便。
但是,在代码示例中,它们使用它来创建前5位的掩码,然后对这些位执行某些操作。我无法想象他们希望你连续写入32个调用给CreateMask,以便能够用左边的位做一些事情。