要求口译

时间:2013-03-04 15:53:05

标签: c# caching

有人可以向我指出一个解释,如果有的话,对这段代码及其作用和原因?特别是底线...

protected uint uMask;
int nBits = (int)Math.Log(BlockSize, 2);
uMask = 0xffffffff << nBits;

例如,在第一次迭代时,BlockSize为8,nBits为3,操作后,uMask为4294967288。

我尝试使用谷歌搜索第三行,因为我不知道如何将它变成简单的语言,我得到了代码的例子,这不是我想要的。

1 个答案:

答案 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

除非你有数学能力,否则你将永远无法读取十进制的面具。