我目前正试图破译别人的代码,我遇到过这样的事情:
byte* d = new byte[n]; // Value of 'n' is determined at runtime.
byte* w1 = d + offset; // Value of 'offset' is constant and even.
...
for(int i = 0; i < imageCount; ++i){
w1 += d - w1 & 7; // At this point, 'd' didnt change, and w1 > d.
...
}
我不明白循环中的指令是做什么的,并且它是有用的 指针'w1'用于将数据写入带有偏移的'd' 然后他用'd'在磁盘上写字。
答案 0 :(得分:3)
这使w1
与相对于d
开头的下一个8字节边界对齐,如果w1
已经在该边界上则保持不变。
w1 - d
将当前偏移量返回到d
。因此,d - w1
提供了负面信息。
Anding with 7给你一个数字0 .. 7。
那么如何将w1添加到下一个8字节边界?假设d
为1000.让我们看看当w1
的值为1001到1008时会发生什么。我将添加括号以使其更清晰。
(1000 - 1001) = -1; (-1) & 7 = 7;
(1000 - 1002) = -2; (-2) & 7 = 6;
(1000 - 1003) = -3; (-3) & 7 = 5;
.... ok, this is getting tedious ....
(1000 - 1008) = -8; (-8) & 7 = 0;
现在您将注意到,如果您将生成的值添加到w1
的起始值,则所有这8个结尾都在1008上。如果您使用1009到1016重复此练习,您将看到相同的内容事情发生在那里,将它们全部整理到1016。
请注意,这非常特定ptrdiff_t
是一个2s补码(几乎在每个现代系统中都是如此)。