Битовые операторы, а не против использования 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)

Ответы на вопрос(1)

Ваш ответ на вопрос