我正在努力理解这段代码。这看起来像是在试图识别版本,但我不清楚其意图。为什么我们要进行比特转换?为什么选择0x3F
?
MinimumVersion = (version.Build & 0x7FFF) |
((version.Minor & 0x3F) << 16) |
((version.Major & 0x3F) << 22) |
0x70008000;
当我用版本部分替换变量时,我得到1941995520
。这个结构是如何工作的?
我做了这个
Console.WriteLine(0 & 0x7FFF);
Console.WriteLine((0 & 0x3F) << 16);
Console.WriteLine((15 & 0x3F) << 22);
Console.WriteLine(0x70008000);
退货为
0
0
62914560
1879080960
这些总和实际上是1941995520
要理解这一点,您需要理解我所说的位字段操作。我将从基础知识开始,让它清楚
x & y
这是一个比特和。这意味着,如果在源和目标中设置了一个位,那么它将在结果中设置。此代码使用的是掩码
x & 0x3F
记住0x3F的位表示是6位(0011111(,所以这是取底部的6个二进制(位(数字并保留这些数字,但删除其他所有数字。剩下的是一个可容纳6位二进制数字的数字。
a | b
这是位或。这意味着,如果在任一操作数中设置了一个位,则该位将在输出中设置。
如果没有";"重叠";位。
这里是一个例子,我将使用较小的数字(和较小的位字段(——记住1111(4位(等于15或0x0F
假设我们有
x = 3 and y = 5 or (0x03 and 0x05)
如果我们做
(x & 0x0F) << 4 | (y & 0x0F)
这将给我们0x35
我们将2个4位值存储在8位中。我们还确保x和y适合4位
您显示的代码正在执行类似的操作,但具有不同大小的位字段。
(version.Build & 0x7FFF) |
((version.Minor & 0x3F) << 16) |
((version.Major & 0x3F) << 22) |
0x70008000;
上面写着
将值放入版本中。内置底部15位
输入version的值。第22位至第17位中的次要
输入version的值。专业在第28-23位
将位于0b111000000000001000000000000000的位设置为true。
所以你最终得到的数字会随着版本号的增大而变大,并且适合长