![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема NUXI (преобразование endian) [D6, WinXP]
Rocket © (2004-11-20 09:45:00)Сделал поиск по инету.
Ничего не нашёл лучше, чем.
Function Reverse (N:LongInt) : LongInt ;
Var B0, B1, B2, B3 : Byte ;
Begin
B0 := N Mod 256 ;
N := N Div 256 ;
B1 := N Mod 256 ;
N := N Div 256 ;
B2 := N Mod 256 ;
N := N Div 256 ;
B3 := N Mod 256 ;
Reverse := (((B0 * 256 + B1) * 256 + B2) * 256 + B3) ;
End ;
или более эффективная версия:
Function Reverse (N:LongInt) : LongInt ;
Var B0, B1, B2, B3 : Byte ;
Begin
B0 := (N AND $000000FF) SHR 0 ;
B1 := (N AND $0000FF00) SHR 8 ;
B2 := (N AND $00FF0000) SHR 16 ;
B3 := (N AND $FF000000) SHR 24 ;
Reverse := (B0 SHL 24) OR (B1 SHL 16) OR (B2 SHL 8) OR (B3 SHL 0) ;
End ;
Есть ещё эффективнее что-нибудь?
Rocket (2004-11-20 11:23:00) [1]OK!
MBo (2004-11-20 11:19:00) [2]>И можно полностью ф-цию, которая делает то, что записано в [7]?
Как уже сказали, ROR eax,16
Anatoly Podgoretsky (2004-11-20 11:18:00) [3]В [9] в один ход
Rocket (2004-11-20 11:12:00) [4]
> Раз про АСМ, то тебе прямой путь на Интел за документацией
Да нет. Просто показалось, что с функцией на асм будет быстрее, хоть и в три хода.
И можно полностью ф-цию, которая делает то, что записано в [7]?
А то я что-то путаться начинаю уже :)
Anatoly Podgoretsky (2004-11-20 11:06:00) [5]Раз про АСМ, то тебе прямой путь на Интел за документацией, копия есть на моем сайте
Anatoly Podgoretsky (2004-11-20 11:05:00) [6]ROR/ROL r,n
Anatoly Podgoretsky (2004-11-20 11:03:00) [7]Rocket © (20.11.04 10:57) [7]
Нет, мат в три хода
Rocket (2004-11-20 10:57:00) [8]ОК. Спасибо ещё раз.
А вот допустим у меня записано так.
03 04 01 02
А должно быть
01 02 03 04
Мат одним ходом возможен? :)
MBo (2004-11-20 10:53:00) [9]>XCHG ah, al
Ууу, и правда ;)
Anatoly Podgoretsky (2004-11-20 10:49:00) [10]Rocket © (20.11.04 10:37) [3]
XCHG ah, al
MBo (2004-11-20 10:47:00) [11]>А чтоб в word'ах менять - так же?
есть функция Swap, или через сдвиги/or можно, или так:
mov ax, w (movzx eax,w)
bswap eax
shr eax,16
Rocket (2004-11-20 10:37:00) [12]
> MBo © (20.11.04 10:28) [2]
Круто, Спасибо!
А чтоб в word'ах менять - так же?
MBo (2004-11-20 10:28:00) [13]
function Reverse(N: Integer): Integer;
asm
bswap eax
end;
procedure TForm1.Button1Click(Sender: TObject);
var n: Integer;
begin
n := $01020304;
n := Reverse(N);
Caption := IntToHex(N, 8);
end;
Rocket (2004-11-20 10:15:00) [14]Может то же самое на asm? Сам перевести не смогу, нужна помощь.