Delphi(实际上是Pascal)具有函数Odd(x:integer):boolean,如果参数不能被2整除,则返回true,如果是,则返回false:
if Odd(x) then
WriteLn('Argument is odd.')
else
WriteLn('Argument is even.')
或者可以使用mod运算符:
if (x mod 2) <> 0 then
WriteLn('Argument is odd.')
else
WriteLn('Argument is even.')
表现有什么不同吗?我希望编译器为系统函数生成优化代码。
我对有关Delphi 2007的答案特别感兴趣,但是如果有人可以检查其他Delphi版本那么会很好。
答案 0 :(得分:11)
无论如何,奇数是最好的;
对于x mod 2
检查,性能取决于x
是有符号整数还是无符号整数;为无符号类型生成的代码更有效。
Delphi XE编译器:
奇(X):
Project11.dpr.10: if Odd(x) then
0040F327 F645FC01 test byte ptr [ebp-$04],$01
0040F32B 741B jz $0040f348
x mod 2,无符号x
(长字):
Project11.dpr.14: if (x mod 2) <> 0 then
0040F431 8B45FC mov eax,[ebp-$04]
0040F434 83E001 and eax,$01
0040F437 85C0 test eax,eax
0040F439 741B jz $0040f456
x mod 2,签名x
(longint):
Project11.dpr.14: if (x mod 2) <> 0 then
0040F361 8B45FC mov eax,[ebp-$04]
0040F364 2501000080 and eax,$80000001
0040F369 7905 jns $0040f370
0040F36B 48 dec eax
0040F36C 83C8FE or eax,-$02
0040F36F 40 inc eax
0040F370 85C0 test eax,eax
0040F372 741B jz $0040f38f
答案 1 :(得分:7)
Odd使用test
指令生成最佳代码(检查最低位),然后跳转为零。自从Turbo Pascal以来就是这样。
获得相同代码的另一种方法是
if x and 1 <> 0 then
但是为什么要在使用Odd
以更清洁的方式编写代码时编写此类代码。