0

有人可以向我解释一下,如果有的话,解释一下这段代码,它做了什么,为什么?特别是底线...

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

例如,第一次迭代 BlockSize 为 8,nBits 为 3,运算后 uMask 为 4294967288。

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

4

1 回答 1

1

这看起来是在创建一个掩码以从更大的结构中排除位。有些数据可能存储在一个较大的值中,并且有一个最大值Blocksize。此代码确定该项目需要多少位,给定其在 中的最大值Blocksize。然后它使用这个位数来创建一个掩码。在最后一行之后,uMask二进制看起来像这样(假设Blocksize是 8 和nBits3:

1111111111111111111111111111111111111111111111111111111111111000

或十六进制:

0xfffffffc

这通常用于删除存储在数据中的一个字段,以隔离其他字段。从概念上讲,您可能在 64 位值中有用于值 A 和值 B 的位:

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBB

假设您想获得 A 的值。您可以执行以下操作:

result = value & uMask;     // Step 1: Mask off B
result = result >> nBits    // Step 2:Align A

数据将如下所示:

Step 1:     AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA000
Step 2:     000AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

除非您具有出色的数学能力,否则您将永远无法阅读十进制的掩码。

于 2013-03-04T17:14:37.503 回答