有人可以向我指出一个解释,如果有的话,对这段代码及其作用和原因?特别是底线...
protected uint uMask;
int nBits = (int)Math.Log(BlockSize, 2);
uMask = 0xffffffff << nBits;
例如,在第一次迭代时,BlockSize为8,nBits为3,操作后,uMask为4294967288。
我尝试使用谷歌搜索第三行,因为我不知道如何将它变成简单的语言,我得到了代码的例子,这不是我想要的。
答案 0 :(得分:1)
这看起来是创建一个掩码来从较大的结构中排除位。某些数据可能存储在一个较大的值中,并具有最大值Blocksize
。此代码根据Blocksize
中的最大值确定该项所需的位数。然后它使用这个位数来创建一个掩码。在最后一行之后,uMask
将在二进制中看起来像这样(假设Blocksize
为8且nBits
为3:
1111111111111111111111111111111111111111111111111111111111111000
或以十六进制:
0xfffffffc
这通常用于删除存储在数据片段中的一个字段,以便隔离一些其他字段。从概念上讲,您可能将位用于值A,将值B用于64位值:
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBB
假设您想获得A的值。您可以这样做:
result = value & uMask; // Step 1: Mask off B
result = result >> nBits // Step 2:Align A
数据将如下所示:
Step 1: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA000
Step 2: 000AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
除非你有数学能力,否则你将永远无法读取十进制的面具。