加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 函数Odd(x)和((x Mod 2)<> 0之间是否存在差异

发布时间:2020-12-15 09:10:07 所属栏目:大数据 来源:网络整理
导读: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('Ar
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版本那就太好了.

解决方法

无论如何奇数是最好的;

对于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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读