1. C++ / Говнокод #3196

    +128

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    /********************************************************************
    ОПЕРАЦИЯ ЛОГИЧЕСКОЕ ИСКЛЮЧАЮЩЕЕ ИЛИ
    ********************************************************************/
    static inline bool XOR(bool lhs, bool rhs)
    {
        return (lhs && !rhs) || ( !lhs && rhs);
    }

    Человек не знал, что есть стандартный xor...

    Запостил: m08pvv, 11 Мая 2010

    Комментарии (22) RSS

    • Тогда уж проще lhs != rhs
      Ответить
    • Кстати логического XOR стандартного нет. Есть только побитовый ^.
      Ответить
      • А чем он не xor?

        true == 1
        false == 0

        Есть, конечно иные варианты логики, но это уже изврат!

        P.S. на всех известных мне компиляторах такой xor и побитовый отличаются только тем, что говнокодовый медленнее!
        Ответить
        • >А чем он не xor?
          Кто он ? Стандартного нет и баста. Проще чем сказал TarasB придумать сложно.
          >такой xor и побитовый отличаются только тем, что говнокодовый медленнее!
          XOR из ГК логический, а не побитовый. Вы вообще понимаете разницу между логическими и побитовыми операциями ?
          Ответить
          • Если сначала привести аргументы к bool, то побитовые операции станут логическими.
            Проверка на неравенство катит тоже только после приведения к bool.
            Ответить
            • А если нам нужна скорость, то ксор выгоднее неравенста.
              Ответить
            • Зависит от двоичного представления bool'а.
              Ответить
          • При
            true == 1
            false == 0
            разницы нету! разве что ^ выполняется процессором безумно быстро
            Ответить
            • >выполняется процессором безумно быстро
              Безумно...
              Ответить
              • MOV AX, 0 ; выполняется медленнее, чем
                XOR AX, AX ; вот эта битовая операция

                ; посему и пишут всегда XOR AX, AX вместо MOV'а
                Ответить
            • Неужели ? Проверим ...
              bool a, b, c;
              clock_t clock1 = clock( );
              for( int i=0; i<1000000000; ++i )
              {
              	// c = a != b;
              	c = a ^ b;
              }
              clock_t clock2 = clock( );
              cout << clock2 - clock1  << endl;

              У меня получились одинаковые результаты для != и ^.
              Что ещё интереснее логические операции И, ИЛИ оказались быстрее битовых.
              Ответить
              • Оптимизации отключали? ~_^
                Ответить
                • >Оптимизации отключали?
                  Безусловно.

                  С оптимизацией != и ^ снова одинаковы.
                  Логические И, ИЛИ и вовсе в ~30 раз быстрее побитовых.
                  Собственно сами бы давно проверили чтоб не спрашивать :)
                  Ответить
                  • Я почему, собсно, спросил, так это потому, что я замерял в суровых BC и gcc с отключенными всеми оптимизациями, так у меня ^ в 80-150 раз быстрее, чем !=
                    И это весьма логично и ожидаемо (из опыта программирования на asm x86)
                    Ответить
                    • В VS2008 битовые и логические оказались по скорости эквивалентны.
                      Изначально тестировал на Eclipse с MinGW.
                      Ответить
                • Зачем отключать оптимизации? о_0
                  Их надо оставить, просто надо использовать volatile и проверять, objdump-ом, что скомпилен правильный код.

                  Вы ж не будете итоговый проект компилировать без оптимизаций.

                  Вообще, очень рекомендую бросать куски дизассемблированного кода, чтобы мы поняли о чём в реальности идёт речь
                  Ответить
    • написано правильно, как в школе учили: либо то, либо другое, но никак не оба.
      Ответить
      • Если по-школьному, то тогда дословно так:
        (lhs || rhs) && !(lhs && rhs)
        Ответить
    • не всё то говнокод, что недоступно пониманию. автор fail
      Ответить
      • А сейчас кто-нибудь скажет, что пора перегрузить operator^^... :D
        Ответить
        • Анимэ? Перегрузить оператор ;) на ^^ ?
          Ответить
      • Данный код взят из программы, от которой требуется МАКСИМАЛЬНАЯ производительность, ибо этот xor там выполняется такое число раз, что эта туева хуча лишних операций замедляет сурово
        Ответить

    Добавить комментарий