测试数字是奇数还是偶数, 我的理解是使用
进行测试(n%2==1)
与
相同(n&1==1)
我认为第一次测试更快(如果我错了请纠正我),但是任何编译器都认识到这一点并“纠正”它吗?这会对性能产生任何影响吗?
答案 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