Зачем использовать XOR с буквальным вместо инверсии (побито и не)C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Зачем использовать XOR с буквальным вместо инверсии (побито и не)

Сообщение Anonymous »

Я наткнулся на этот код CRC32, и мне было любопытно, почему автор решит использовать < /p>
crc = crc ^ ~0U;
< /code>
вместо < /p>
crc = ~crc;

Насколько я могу судить, они эквивалентны. crc = crc ^ ~0U;
009D13F4 mov eax,dword ptr [crc]
009D13F7 xor eax,0FFFFFFFFh
009D13FA mov dword ptr [crc],eax

crc = ~crc;
011C13F4 mov eax,dword ptr [crc]
011C13F7 not eax
011C13F9 mov dword ptr [crc],eax
< /code>
Я также не могу оправдать код, подумав о количестве циклов, которые принимает каждая инструкция, поскольку оба должны занять 1 цикл. Фактически, xor может иметь штраф, если бы я ни был, чтобы загрузить буквальные, хотя я не уверен в этом.
Так что я думаю, что это, возможно, просто предпочтительный способ описать алгоритм, а не оптимизация ... это было бы правильным? понял, что тип переменной CRC , вероятно, важно упомянуть, что я включаю весь код (меньше таблицы поиска, слишком большой), поэтому вам не нужно перемещаться по ссылке.
uint32_t crc32(uint32_t crc, const void *buf, size_t size)
{
const uint8_t *p;

p = buf;
crc = crc ^ ~0U;

while (size--)
{
crc = crc32_tab[(crc ^ *p++) & 0xFF] ^ (crc >> 8);
}

return crc ^ ~0U;
}

edit 2:
Поскольку кто -то поднял тот факт, что оптимизированная сборка была бы интересна, я сделал один и включил ее ниже. />// crc = crc ^ ~0U;
zeroCrc = 0;
zeroCrc = crc32(zeroCrc, zeroBufferSmall, sizeof(zeroBufferSmall));
00971148 mov ecx,14h
0097114D lea edx,[ebp-40h]
00971150 or eax,0FFFFFFFFh
00971153 movzx esi,byte ptr [edx]
00971156 xor esi,eax
00971158 and esi,0FFh
0097115E shr eax,8
00971161 xor eax,dword ptr ___defaultmatherr+4 (973018h)[esi*4]
00971168 add edx,ebx
0097116A sub ecx,ebx
0097116C jne main+153h (971153h)
0097116E not eax
00971170 mov ebx,eax

// crc = ~crc;
zeroCrc = 0;
zeroCrc = crc32(zeroCrc, zeroBufferSmall, sizeof(zeroBufferSmall));
01251148 mov ecx,14h
0125114D lea edx,[ebp-40h]
01251150 or eax,0FFFFFFFFh
01251153 movzx esi,byte ptr [edx]
01251156 xor esi,eax
01251158 and esi,0FFh
0125115E shr eax,8
01251161 xor eax,dword ptr ___defaultmatherr+4 (1253018h)[esi*4]
01251168 add edx,ebx
0125116A sub ecx,ebx
0125116C jne main+153h (1251153h)
0125116E not eax
01251170 mov ebx,eax


Подробнее здесь: https://stackoverflow.com/questions/223 ... itwise-not
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»