|
|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Oleg Ponomarev 2:5020/400 04 Jul 2001 13:03:22 To : All Subject : Re: Коды Гpея -------------------------------------------------------------------------------- Hi! Alexandr Ivanov wrote: > so> Гениально! А как обpатно? > > Function FromGrey(Value : Word) : Word; assembler; [...] > Всего хоpошего и смотpи не кашляй! Я протестировал процедуры обратного перевода из кода Грея в "обычный". Тестировались три варианта: 1. Ассемблерный вариант от Alexandr Ivanov 2. Вариант от Yuri Gendelman присланный мне по мылу. 3. Вариант из Numerical Recipes предоставленый Vlad Bespalov Все они работают правильно, но получилось, что самый быстрым оказался второй вариант, самым медленным первый ассемблерный вариант (как ни странно). Вариант Среднее кол-во тиков 1 228 2 85 3 121 Возможно, конечно, что я где-то ошибся, так как перевел исходники на Паскаль. Среда разработки Delphi 5. Посмотрите, плиз, я ничего не напутал? ========================================================= function GreyCode(Value : Integer) : Integer; begin Result := (Value shr 1) xor Value; end; { Вариант 1 } { я попытался переделать на 32-разрядный вариант, но это не помогло } Function FromGrey(Value : Integer) : Integer; assembler; asm mov EAX,Value mov ECX,EAX @L1: shr ECX,1 xor EAX,ECX or ECX,0 // а почему сравние с нулем? jnz @L1 end; { Вариант 2 } function ReverseGreyCode(Value : Integer) : Integer; const mxShift = SizeOf(Value) * 4; var i : integer; begin i := 1; while i <= mxShift do begin Value := Value xor (Value shr i); i := i shl 1; end; ReverseGreyCode := Value; end; { Вариант 3 } function IGreyCode(Value : Integer) : Integer; var Work : integer; Shift : integer; begin Shift := 1; while True do begin Work := Value shr Shift; Value := Value xor Work; { видимо, тормозит из-за проверки Work <= 1 } if (Work <= 1) or (Shift = 16) then begin IGreyCode := Value; Exit; end; Shift := Shift shl 1; end; end; ========================================================= -- Ponch mailto:O.Ponomarev@vaz.ru phone: (848-2) 73-83-49 --- ifmail v.2.15dev5 * Origin: AvtoVAZ (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/15206914c302.html, оценка из 5, голосов 10
|