Битовые операторы, а не против использования xor в ветвлении
Спросивэтот ТАК вопросЯ получил очень интересный комментарий от @ AndonM.Coleman, который мне пришлось проверить.
Поскольку ваш дизассемблированный код написан для x86, стоит указать, что XOR установит / сбросит нулевой флаг, а NOT - нет (иногда полезно, если вы хотите выполнить побитовую операцию, не затрагивая условия перехода, которые зависят от флагов от предыдущих операций) , Теперь, учитывая, что вы не пишете сборку напрямую, у вас действительно нет значимого доступа к этому флагу, поэтому я сомневаюсь, что это причина для предпочтения одного над другим.
Его комментарий меня заинтересовал, если следующий код будет производить те же инструкции по сборке
#include <iostream>
int main()
{
unsigned int val = 0;
std::cout << "Enter a numeric value: ";
std::cin >> val;
if ( (val ^ ~0U) == 0)
{
std::cout << "Value inverted is zero" << std::endl;
} else
{
std::cout << "Value inverted is not zero" << std::endl;
}
if ( (~val) == 0)
{
std::cout << "Value inverted is zero" << std::endl;
} else
{
std::cout << "Value inverted is not zero" << std::endl;
}
return 0;
}
Для следующих двух операций
if ( (val ^ ~0U) == 0 )
а также
if ( (~val) == 0 )
не оптимизирован Сборка в Visual Studio 2010 дает следующую разборку:
if ( (val ^ ~0U) == 0)
00AD1501 mov eax,dword ptr [val]
00AD1504 xor eax,0FFFFFFFFh
00AD1507 jne main+86h (0AD1536h)
if ( (~val) == 0)
00AD1561 mov eax,dword ptr [val]
00AD1564 not eax
00AD1566 test eax,eax
00AD1568 jne main+0E7h (0AD1597h)
Мой вопрос касается оптимизации. Лучше написать
if ( (val ^ ~0U) == 0)
или же
if ( (~val) == 0)