代码的意图是使用二进制位和移位运算符,找到最小版本



我正在努力理解这段代码。这看起来像是在试图识别版本,但我不清楚其意图。为什么我们要进行比特转换?为什么选择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。

所以你最终得到的数字会随着版本号的增大而变大,并且适合长

相关内容

  • 没有找到相关文章

最新更新