gcc(或任何其他编译器)是否会更改(n%2 == 1)(n& 1 == 1)?

时间:2015-05-13 23:57:56

标签: gcc

测试数字是奇数还是偶数, 我的理解是使用

进行测试
(n%2==1)

相同
(n&1==1)

我认为第一次测试更快(如果我错了请纠正我),但是任何编译器都认识到这一点并“纠正”它吗?这会对性能产生任何影响吗?

2 个答案:

答案 0 :(得分:0)

void main()
{
    int n = 5;
    int i = n & 1;
}
    call    __main
    movl    $5, -4(%rbp)
    movl    -4(%rbp), %eax
    andl    $1, %eax
    movl    %eax, -8(%rbp)
    addq    $48, %rsp
    popq    %rbp
    ret

void main()
{
    int n = 5;
    int i = n % 2;
}
    call    __main
    movl    $5, -4(%rbp)
    movl    -4(%rbp), %eax
    cltd
    shrl    $31, %edx
    addl    %edx, %eax
    andl    $1, %eax
    subl    %edx, %eax
    movl    %eax, -8(%rbp)
    addq    $48, %rsp
    popq    %rbp
    ret

使用-S -O0来尝试使用gcc.exe(GCC)4.9.2 因此& 1检查奇偶校验的接缝稍微好一些。

答案 1 :(得分:-1)

实际上
PS C:\Users\jo> conda env list # conda environments: # py3 C:\Anaconda\envs\py3 root * C:\Anaconda 是不一样的 activate 如果(n%2==1)的类型是(n&1==1),那么编译器代码(gcc 5.1,-Ofast,64bit):

n

所以主要部分看起来像(伪代码):

signed int

但是如果n的类型是" unsigned int"一切看起来都很棒(gcc 5.1,-Ofast):

int f(int n)
{
    return (n % 2) == 1;
0:   89 f8                   mov    %edi,%eax
2:   c1 e8 1f                shr    $0x1f,%eax
5:   01 c7                   add    %eax,%edi
7:   83 e7 01                and    $0x1,%edi
a:   29 c7                   sub    %eax,%edi
c:   31 c0                   xor    %eax,%eax
e:   83 ff 01                cmp    $0x1,%edi
11:   0f 94 c0                sete   %al
}
14:   c3                      retq