2016-07-13 4 views
1

При условии, что у меня есть два байт переменных в Delphi:Объединить два байта в Дельфах

var 
    b1,b2,result:byte; 
begin 
    b1:=$05; 
    b2:=$04; 
    result:=??? // $54 
end; 

Как бы объединить два, чтобы произвести байты значения $54?

+3

'result: = (b1 shl 4) или (b2 и $ 0F);' – kludg

ответ

3

Наиболее простой способ

result := b1 * $10 + b2 

"Advanced" путь:

result := b1 shl 4 + b2 
+2

вы действительно лучше охраняете диапазон b2 на '(b2 и $ 0F);' как другой пользователь сказал в комментарии выше! –

+0

Конечно, вы правы, но это зависит ... Я не знаю, где автор получает эти значения, поэтому я предполагаю, что они уже правильные. В большинстве случаев они уже есть, и вам не нужно добавлять еще одну операцию. –

+0

Ну, если нужно так много сырой скорости, что один дополнительный код операции становится проблемой, он все равно не будет писать свою программу в Delphi. Так что «лучше безопасно, чем жаль» выглядит более подходящим здесь. В конце концов, все мы используем виртуальные методы, и их вызов (по сравнению со статическими методами) намного дороже, чем один «AND AL, 15». И все мы используем DLL/BPL, которые также привносят дополнительную нагрузку для каждого вызова функции, который менее тяжелый, чем поиск VMT, но все еще более дорогой, чем сингл 'AND' –

1

Лучше всего было бы:

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. Это простой встроенный метод, который даже не вызывает вызов.

Смежные вопросы