gpt4 book ai didi

c# - 按位运算符让我见鬼去吧

转载 作者:行者123 更新时间:2023-11-30 15:41:12 25 4
gpt4 key购买 nike

我正在努力思考 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;
}

xBlock 将是您要为其查找偏移量的 block 号。我不确定 header 大小的重要性是什么,但我认为它决定了其余代码的偏移量。无论如何,我无法理解按位运算符在做什么。 header 大小为 38682, block 0 位于 0xA000,但同样,我不知道它是如何工作的。

有人可以帮我吗?

编辑:任何关于使用位运算符的信息都会很棒。我了解它们的工作原理,但我只是不了解它们的使用方式,尤其是在这种情况下,这似乎在插入它们的效率。

最佳答案

让我们从头开始分解它:

xBlock << 12

这个左移运算符告诉我们 block 大小是 4096,因为:

1 << 12 = 1000000000000 (binary) = 4096 (decimal)

现在,第一部分是向 header 大小添加一个常量:

MetaData.HeaderSize + 0xFFF

0xFFF 是 4095。注意它只比 4096 少 1。

1000000000000 (4096 in binary)
0111111111111 (4095 in binary)

下一部分现在是清除低 12 位,因为 0xF000 在二进制中是:

1111000000000000 (1111 followed by 12 0s)

因此,据我所知,发生的事情是:

1) 获取头部大小并添加 block 大小 - 1

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

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

关于c# - 按位运算符让我见鬼去吧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8612691/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com