![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
asm
Ильичев С.А. © (2005-10-20 13:21:00)Скажите пожалуйста что быстрее.
Или как-то по другому можно?
1.
function DivTwoAndCeil(const X: Integer): Integer;
begin
Result := X div 2;
if X mod 2 > 0 then inc(Result);
end;
2.
function DivTwoAndCeil(X: Integer): Integer; assembler;
asm
MOV EAX, X
MOV ECX, EAX
SHR EAX, 1
AND ECX, 1
ADD EAX, ECX
MOV Result, EAX
end;
Fenik (2005-11-01 17:34:00) [1]function DivTwoAndCeil(const X: Integer): Integer;
begin
Result := (X+1) shr 1;
end;
icWasya (2005-11-01 09:31:00) [2]
function DivTwoAndCeil(const X: Integer): Integer;
begin
Result := (X+1) div 2;
end;
Cyberdeamon (2005-10-31 23:23:00) [3]Удалено модератором
Cyberdeamon (2005-10-31 23:22:00) [4]
<CO DE>
evvcom (2005-10-20 14:38:00) [5]asm
SHR EAX, 1
ADC EAX, 0
end;
MBo (2005-10-20 14:35:00) [6]Inc(X)
X div 2
Anatoly Podgoretsky (2005-10-20 14:15:00) [7]Y := X DIV 2 + X MOD 2;
Ильичев С.А. (2005-10-20 14:05:00) [8]2 Digitman © (20.10.05 13:52) [5]
за [2] большое спасибо
а в [4] первую срочку внимательнее
Digitman (2005-10-20 13:52:00) [9]
> Ильичев С.А. © (20.10.05 13:40) [4]
как это "не то" ?)
убедись сам :
procedure TForm1.Button3Click(Sender: TObject);
var i: integer;
begin
for i := 0 to 6 do
memo1.Lines.add(inttostr(divtwoandceil(i)));
end;
Ильичев С.А. (2005-10-20 13:40:00) [10]2 Digitman © (20.10.05 13:33) [1]
не то =)
мне надо
f(0) = 0
f(1) = 1
f(2) = 1
f(3) = 2
f(4) = 2
f(5) = 3
f(6) = 3
...
Digitman (2005-10-20 13:38:00) [11]пардон ...
из-за имени ф-ции смысл ее затеи понятен не сразу ..
function DivTwoAndCeil(X: Integer): Integer;
asm
SHR EAX, 1 //или SAR EAX, 1 при необходимости соблюсти знак
JNC @@exit
INC EAX
@@exit:
end;
Anatoly Podgoretsky (2005-10-20 13:38:00) [12]Быстрее не вызывать функцию
Digitman (2005-10-20 13:33:00) [13]function DivTwoAndCeil(X: Integer): Integer;
asm
AND EAX, 1
end;