Неизвестное использование операции с указателем

0

В настоящее время я пытаюсь расшифровать код другого пользователя, и я столкнулся с чем-то вроде этого:

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" для записи на диск.

Теги:
pointers
operators

1 ответ

3
Лучший ответ

Это выравнивает 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 (что примерно на каждой современной системе).

  • 0
    Я думал, что это будет что-то подобное, но не могли бы вы объяснить мне, как именно это происходит?
  • 0
    выравнивает его по следующей 8-байтовой границе относительно d. Например, если d равно 0x00000001, а w1 равно 0x00000002, оно будет выровнено по 0x00000009, а не по 0x00000008.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню