未知使用指针操作

时间:2013-11-22 23:35:00

标签: c++ pointers operators

我目前正试图破译别人的代码,我遇到过这样的事情:

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'在磁盘上写字。

1 个答案:

答案 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补码(几乎在每个现代系统中都是如此)。