Няшная / Говнокод #1407 Ссылка на оригинал

0

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

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

Запостил: guest guest, (Updated )

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

  • А что? 0 подходит и 1 подходит и -1 - тоже. Может им так и надо
    Ответить
  • Вообще сайту очень не хватает раздела "как надо".
    if (0 == (i & 1)) { ... }
    Обсирать мы все горазды... покажите как надо.
    Ответить
      • "&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
            Ответить
              • Стоит добавить, что конечно компилятор свёл деление к shr... Но до and он не догадался таки, хотя делает в данной оптимизиации очень похожий приём.
                Ответить

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

Помни, guest, за тобой могут следить!

    А не использовать ли нам bbcode?


    8