C# 位运算符给了我地狱

C# 位运算符给了我地狱,c#,binary,hex,bit-manipulation,bitwise-operators,C#,Binary,Hex,Bit Manipulation,Bitwise Operators,我试着将我的注意力集中在xbox 360的STFS文件结构上,我正在阅读的页面给出了查找代码块偏移量的代码示例: internal int BlockToOffset(int xBlock) { int xReturn = 0; if (xBlock > 0xFFFFFF) xReturn = -1; else xReturn = (((MetaData.HeaderSize + 0xFFF) & 0xF000) + (xBl

我试着将我的注意力集中在xbox 360的STFS文件结构上,我正在阅读的页面给出了查找代码块偏移量的代码示例:

internal int BlockToOffset(int xBlock)
{
    int xReturn = 0;
    if (xBlock > 0xFFFFFF)
        xReturn = -1;
    else
        xReturn = (((MetaData.HeaderSize + 0xFFF) & 0xF000) + (xBlock << 12));
    return xReturn;
}
内部int BlockToOffset(int xBlock)
{
int xReturn=0;
如果(xBlock>0xFFFFFF)
xReturn=-1;
其他的

xReturn=((MetaData.HeaderSize+0xFFF)和0xF000)+(xBlock让我们从末尾开始将其分开:

xBlock << 12
0xFFF是4095。请注意,它只比4096小1

1000000000000 (4096 in binary)
0111111111111 (4095 in binary)
由于二进制中的0xF000是:

1111000000000000 (1111 followed by 12 0s)
所以,据我所知,发生的是:

1)获取标题大小并添加块大小-1

2)清除下12位,该位舍入到块大小的下一个最大最接近倍数。我不是100%确定这一部分,但我尝试了一些(001+111)&1000 vs(111+111)&1000的示例,似乎就是这样做的

3)当前值是块0的偏移量开始的位置,因此添加适当的4096倍数以获得块的偏移量

(MetaData.HeaderSize + 0xFFF) & 0xF000
此部分本质上是“查找0x1000的下一个最高倍数”,类似于“上限”功能。
例如,如果
HeaderSize
是从0x0001到0x1000,它将舍入到0x1000。但是如果是从0x1001到0x2000,它将舍入到0x2000,以此类推

(xBlock << 12)

(xBlock这是一个有点悬而未决的问题,无论如何,它应该很好地解释文件结构是如何工作的。谢谢,我来看看。编辑:哦,天哪,我读到的信息似乎就是从那里复制来的。关于舍入,你说得对。代码实际上是为元数据保留一些页面,并按顺序存储每个4096页。)然后在它自己的页面中创建一个块。@SebastiaanMegens,Woah,你知道STFS文件结构吗?你能帮我一点忙吗?好的,现在看看头占用了多少块,然后将块数乘以它们的大小相加?
(MetaData.HeaderSize + 0xFFF) & 0xF000
(xBlock << 12)