LINUX.ORG.RU

Подскажите самый быстрый способ перемножить два unsigned int если ...

 fast math, , multiply


0

1

если один из них ограничен значениями 0 и 1.

Нехотелось бы перепроверять все возможные способы. На пока что выяснил что if() по ограниченному инту процентов на 20 быстрее тупого перемножения.

★★★★★

Последнее исправление: cvv (всего исправлений: 1)

А шо, в выхдопе gcc c включенной оптимизацией ветвления присутствуют?

AF ★★★
()
Ответ на: комментарий от anonymous

Благодарю. Интересная мысль.

cvv ★★★★★
() автор топика
Ответ на: комментарий от heaven__12

если совсем сексуально

a &= ~b + 1;

двоичное дополнение с unsigned выглядит каноничней

anonymous
()
Ответ на: комментарий от anonymous

Не gcc.

Anonymous@work:~$ cat 1.c 
#include <stdint.h>
int main(int argc, const char *argv[]) {
        volatile uint32_t a = 1, c = 2, b = 3;
        if (a) { b = c; }
}

Anonymous@work:~$ gcc -O2 -S 1.c

Anonymous@work:~$ cat 1.s 
        .file   "1.c"
        .section        .text.unlikely,"ax",@progbits
.LCOLDB0:
        .section        .text.startup,"ax",@progbits
.LHOTB0:
        .p2align 4,,15
        .globl  main
        .type   main, @function
main:
.LFB11:
        .cfi_startproc
        movl    $1, -12(%rsp)
        movl    $2, -8(%rsp)
        movl    $3, -4(%rsp)
        movl    -12(%rsp), %eax
        testl   %eax, %eax
        je      .L2
        movl    -8(%rsp), %eax
        movl    %eax, -4(%rsp)
.L2:
        rep ret
        .cfi_endproc
.LFE11:
        .size   main, .-main
        .section        .text.unlikely
.LCOLDE0:
        .section        .text.startup
.LHOTE0:
        .ident  "GCC: (Debian 4.9.2-10) 4.9.2"
        .section        .note.GNU-stack,"",@progbits

Как видим, gcc «оптимизирует» в условный переход.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.