При условии, что у меня есть два байт переменных в Delphi:Объединить два байта в Дельфах
var
b1,b2,result:byte;
begin
b1:=$05;
b2:=$04;
result:=??? // $54
end;
Как бы объединить два, чтобы произвести байты значения $54
?
При условии, что у меня есть два байт переменных в Delphi:Объединить два байта в Дельфах
var
b1,b2,result:byte;
begin
b1:=$05;
b2:=$04;
result:=??? // $54
end;
Как бы объединить два, чтобы произвести байты значения $54
?
Наиболее простой способ
result := b1 * $10 + b2
"Advanced" путь:
result := b1 shl 4 + b2
вы действительно лучше охраняете диапазон b2 на '(b2 и $ 0F);' как другой пользователь сказал в комментарии выше! –
Конечно, вы правы, но это зависит ... Я не знаю, где автор получает эти значения, поэтому я предполагаю, что они уже правильные. В большинстве случаев они уже есть, и вам не нужно добавлять еще одну операцию. –
Ну, если нужно так много сырой скорости, что один дополнительный код операции становится проблемой, он все равно не будет писать свою программу в Delphi. Так что «лучше безопасно, чем жаль» выглядит более подходящим здесь. В конце концов, все мы используем виртуальные методы, и их вызов (по сравнению со статическими методами) намного дороже, чем один «AND AL, 15». И все мы используем DLL/BPL, которые также привносят дополнительную нагрузку для каждого вызова функции, который менее тяжелый, чем поиск VMT, но все еще более дорогой, чем сингл 'AND' –
Лучше всего было бы:
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's. Это простой встроенный метод, который даже не вызывает вызов.
'result: = (b1 shl 4) или (b2 и $ 0F);' – kludg