1. Си / Говнокод #1407

    +108.1

    1. 1
    2. 2
    int i;
    if(i/2 == i - i/2) { ... }

    Тоже из лабораторки. Проверка на четность

    Запостил: guest, 23 Июля 2009

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

    • А по-моему, прекрасно :)
      Ответить
    • А что? 0 подходит и 1 подходит и -1 - тоже. Может им так и надо
      Ответить
    • Вообще сайту очень не хватает раздела "как надо".
      if (0 == (i & 1)) { ... }
      Обсирать мы все горазды... покажите как надо.
      Ответить
      • А почему не?
        if (!(i%2)) { ... }
        Ответить
        • "&1" - процессор обработает быстрее.

          Деление - процесс очень трудоёмкий.
          Ответить
          • оригинально! =)
            спс за код
            Ответить
            • Как говорил Кнут, каэдый уважающий себя программист должен знать хотя бы один машинный язык. Это я Вам и советую сделать - изучить к примеру, ассемблер ;)..

              Кстати, на wikibooks был неплохой вводый курс в ассемблер для Сишников.

              Ещё у меня есть документация по оптимизации приложений для разных процессоров, там указано какая инструкция сколько тактов выполняется, некоторые из них ты сможешь найти тут: ftp://xaionaro.ultanet.org/programming/ (к примеру: ftp://xaionaro.ultanet.org/programming/Assembler/athlon-code-optimization.pdf)
              Ответить
              • Я по-настоящему стал понимать С++ только после того, как изучил ассемблер.
                Ответить
                • Верно говоришь. С ассемблера стоит даже начинать. Дальше уже действительно можно понять высокоуровневый язык.
                  Ответить
          • Вы так говорите, как будто компилятор со включенной оптимизацией сгенерит различный код
            Ответить
            • А вы так говорите, будтро не понимаете, что действительно может сгенерить разный.

              К примеру используем gcc 4.3.3 и компилируем с флагом "-O2" два файла:
              [xaionaro@nemesis ~]$ cat > 1.c
              int f1(int a) {
                      return a&1;
              }
              ^D
              [xaionaro@nemesis ~]$ cat > 1.c
              int f1(int a) {
                      return a%2;
              }
              ^D

              [xaionaro@nemesis ~]$ gcc -O2 1.c -c -o 1.o
              [xaionaro@nemesis ~]$ gcc -O2 2.c -c -o 2.o

              И вауля:
              [xaionaro@nemesis ~]$ objdump -d 1.o
              
              1.o:     file format elf64-x86-64
              
              
              Disassembly of section .text:
              
              0000000000000000 <f1>:
                 0:   83 e7 01                and    $0x1,%edi
                 3:   89 f8                   mov    %edi,%eax
                 5:   c3                      retq   
              [xaionaro@nemesis ~]$ objdump -d 2.o
              
              2.o:     file format elf64-x86-64
              
              
              Disassembly of section .text:
              
              0000000000000000 <f1>:
                 0:   89 fa                   mov    %edi,%edx
                 2:   c1 ea 1f                shr    $0x1f,%edx
                 5:   8d 04 17                lea    (%rdi,%rdx,1),%eax
                 8:   83 e0 01                and    $0x1,%eax
                 b:   29 d0                   sub    %edx,%eax
                 d:   c3                      retq
              Ответить
              • Описка во втором "cat", там имеется ввиду "cat > 2.c".
                Ответить
                • Стоит добавить, что конечно компилятор свёл деление к shr... Но до and он не догадался таки, хотя делает в данной оптимизиации очень похожий приём.
                  Ответить
        • if(!(i&1)){ ... }
          Экономим байты исходников ;)
          Ответить
    • [url=http://aptekacatalog.ru/]Lavrushka[/url] cat>2.c
      Ответить

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