В настоящее время я пытаюсь расшифровать код другого пользователя, и я столкнулся с чем-то вроде этого:
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" для записи на диск.
Это выравнивает w1
до следующей 8-байтовой границы относительно начала d
, оставаясь при этом, если w1
уже находится на этой границе.
w1 - d
возвращает текущее смещение в d
. Поэтому d - w1
дает отрицательный результат.
Андинг с 7 дает вам номер 0.. 7.
Итак, как добавить, что w1 переместит 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 (что примерно на каждой современной системе).