【发布时间】:2016-11-15 19:03:32
【问题描述】:
假设我在Delphi中有两个字节变量:
var
b1,b2,result:byte;
begin
b1:=$05;
b2:=$04;
result:=??? // $54
end;
然后我如何将两者结合起来产生一个字节值$54?
【问题讨论】:
-
result:= (b1 shl 4) or (b2 and $0F);
标签: delphi
假设我在Delphi中有两个字节变量:
var
b1,b2,result:byte;
begin
b1:=$05;
b2:=$04;
result:=??? // $54
end;
然后我如何将两者结合起来产生一个字节值$54?
【问题讨论】:
result:= (b1 shl 4) or (b2 and $0F);
标签: delphi
最简单的方法是
result := b1 * $10 + b2
“高级”方式:
result := b1 shl 4 + b2
【讨论】:
(b2 and $0F); 就像另一位用户在上面的评论中所说的那样!
AND AL, 15 昂贵得多。而且我们都使用 DLLs/BPLs,这也会为每个函数调用带来额外的负担,这比 VMT 查找要轻,但仍然比单个 AND
he would not write his program in Delphi anyway - 是的))
$54,包括琐碎的Result := $54,但也可以是Result := (b2 + 1) shr 4 + (b1 - 1)。没有提问者的意见,你不能争论哪个是正确的。您所能做的就是提及可能的解释并描述它们的不同之处。你提到了可能性,但没有向 Raw 提供任何信息来判断它们的优点。
最好的办法是:
interface
function combine(a,b: integer): integer; inline; //allows inlining in other units
implementation
function combine(a,b: cardinal): cardinal; inline;
begin
Assert((a <= $f));
Assert((b <= $f));
Result:= a * 16 + b;
end;
由于partial register stalls,使用字节寄存器会降低处理器速度。
断言将在发布模式下被消除。
如果性能很重要,请不要使用除整数(或基数)以外的任何东西。
我不知道为什么人们在谈论 VMT 或 dll。这是一个简单的内联方法,甚至不会生成调用。
【讨论】: