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

Delphi内联更改对位读取的回答

发布时间:2020-12-15 04:33:42 所属栏目:大数据 来源:网络整理
导读:我正在使用Delphi Berlin和默认的编译器选项.我正在做一些例程并且有一个案例,其中内联更改答案. 我的代码: function BitGetFromQWord( const AQWord: UInt64; ABitIdx: UInt64 ): Boolean; //inline;begin Assert( ABitIdx64 ); Result := ((1 shl ABitIdx
我正在使用Delphi Berlin和默认的编译器选项.我正在做一些例程并且有一个案例,其中内联更改答案.

我的代码:

function BitGetFromQWord( const AQWord: UInt64; ABitIdx: UInt64 ): Boolean; //inline;
begin
  Assert( ABitIdx<64 );
  Result := ((1 shl ABitIdx) and AQWord)<>0;
end;

procedure TForm22.Button1Click(Sender: TObject);
begin
  ShowMessage( BoolToStr( BitGetFromQWord( $CBBE02D50FD8262F,31 ),True ) );
end;

procedure TForm22.Button2Click(Sender: TObject);
var
  x: Integer;
begin
  x := 31;
  ShowMessage( BoolToStr( BitGetFromQWord( $CBBE02D50FD8262F,x ),True ) );
end;

对于Button1Click,当添加内联时,答案从False(看起来正确)变为True.我的下表是:

Button2Click只是用变量替换常量,总是产生False.

我正在进行大量的检查和设置,并遇到了这种异常现象.这就是为什么随机十六进制数在这里.

在一个较大的项目中,我也有一个具有相同十六进制数和第31位的情况,根据Debug或Release产生不同的结果.无法将其简化为一个合理的例子.

代码看起来正确.我在这里发现了一个类似的32位函数:

Bit Manipulation Using Delphi

所以我的问题是为什么内联词会改变答案?

谢谢你的帮助.

解决方法

您的代码错误,因为按位移位是在32位上下文中执行的.你必须这样写
Result := ((UInt64(1) shl ABitIdx) and AQWord)<>0;

其中施法强制64位算术.

因此,虽然代码的内联版本与非内联版本的行为不同似乎是错误的,但我怀疑真正的问题是代码的行为是不明确的.修复代码后,如上所示,您会发现内联和非内联版本的行为相同,并给出正确的答案.

(编辑:李大同)

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

    推荐文章
      热点阅读