![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сравнить две строки!
KLAUS © (2006-05-20 14:11:00)Всем Привет!!
Народ подскажите как сравнить две строки по байтно?
Только без WildStringCompare!
AlexWlad (2006-05-20 20:53:00) [1]Если нужна скорость попробуй такую процедуру.
function AW_CompareMem(P1, P2: Pointer; Length: Integer): Integer; assembler;
asm
PUSH ESI
PUSH EDI
MOV ESI,P1
MOV EDI,P2
MOV EDX,ECX // Length
XOR EAX,EAX
AND EDX,3 // число байт в хвосте - Length mod 4
SHR ECX,1 // div 2 - WORD
SHR ECX,1 // div 2 - DWORD
REPE CMPSD
JE @@1 // все DWORD равны, анализ хвоста
SUB ESI,4 // поиск байта-отличия в DWORD
SUB EDI,4
MOV EDX,4
@@1: MOV ECX,EDX // сравнение в хвосте
REPE CMPSB
JE @@5 // все BYTE равны
MOVZX EAX,BYTE PTR [ESI-1] // вычисление разницы байт
MOVZX EDX,BYTE PTR [EDI-1]
SUB EAX,EDX
@@5: POP EDI
POP ESI
end;
Пример использования
i := AW_CompareMem(@s1[1],@s2[1],Min(Length(s1),Length(s2)));
KLAUS (2006-05-20 18:40:00) [2]THANKS вообще в самую точку!!!
Glex (2006-05-20 14:19:00) [3]
function CompareStr(const s1, s2: string): boolean;
var i, N: integer;
begin
N := Min(length(s1), length(s2));
result:=true;
for i:=1 to Min do begin
if s1[i]<>s2[i] then begin
result:=false;
exit;
end;
end;
if length(s1)<>length(s2) then result:=false;
end;
Это что ли? =))