Текущий архив: 2003.09.11;
Скачать: CL | DM;
Вниз
как зеркально переставить биты ... Найти похожие ветки
← →
titnn (2003-08-29 03:33) [0]есть к примеру 1100 1001(abcd efgh)
нужно зеркально 1001 0011(hgfe dcba)
как правильнее и быстрее это сделать , на входе и выходе byte
← →
MBo (2003-08-29 07:57) [1]1) самое быстрое - создать таблицу из 256 байт
(0, $80, $40, $C0 ...$FF)
2)
Result:=0;
for i:=0 to 7 do
Result:=Result or ((Source shr i) and 1) shl (7-i);
3) mov dl, Src
xor al,al
mov ecx,8// или 7, не проверял
@@1:
rcr dl,1
rcl al,1
loop @@1
mov Result,al
Есть еще изящные решения с применением масок, но быстрее все равно не будет
← →
Ihor Osov'yak (2003-08-29 08:07) [2]Примерно так:
function ExchBit(aSrc: byte): byte; assembler;
asm
xor ecx, ecx
mov cx,8
@@1:
ror al, 01
shl ax, 1
shr al, 1
loop @@1;
mov al, ah
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Caption := IntToHex(ExchBit($82), 2);
end;
← →
Ihor Osov'yak (2003-08-29 08:11) [3]Сорри, опоздал.. Ну, а на счет таблицы перекодировки, да, не сообразил.. Хотя.. Я бы все же експеримент провел - все таки работа с таблицей перекодировки - несколько обращений к памяти, а сдвиги - как бы внутри процессора все дело... Так что наверно маленький експеримент сделать нужно..
← →
MBo (2003-08-29 08:58) [4]>Ihor Osov"yak
обращение имхо одно
tabl:array[0..255] of byte;
procedure TForm1.FormCreate(Sender: TObject);
var i,j:integer;
begin
FillChar(tabl,sizeof(tabl),0);
for j:=0 to 255 do
for i:=0 to 7 do
tabl[j]:=tabl[j] or ((j shr i) and 1) shl (7-i);
end;
function invertbits(b:byte):byte;
asm
mov al,byte ptr [eax+tabl]
end;
procedure TForm1.Button2Click(Sender: TObject);
var b:byte;
begin
b:=updown1.position;
b:=InvertBits(b);
edit2.text:=inttohex(b,2);
end;
← →
Sha (2003-08-29 09:49) [5]>MBo © (29.08.03 08:58) [4]
function invertbits(b:byte):byte;
asm
and eax,255
mov al,byte ptr [eax+tabl]
end;
← →
MBo (2003-08-29 09:58) [6]>Sha
угу, так аккуратнее.
Для скорости можно еще movzx делать.
← →
titnn (2003-08-29 10:13) [7]сенькс всем за ответы ...
← →
titnn (2003-08-29 11:06) [8]Ihor Osov"yak , твой пример мне больше других понравился, не надо таблицу создавать ...
а можно еще вопросик , как в конце еще и инверсию до кучи сделать , т.е
1100 1000
0011 0111
сам в асме не силен , понимаю что Byte:=(not Byte), но как это в асме написать ?
← →
Anatoly Podgoretsky (2003-08-29 11:12) [9]Ну это совсем смешно - операция NOT
← →
titnn (2003-08-29 11:18) [10]ладно не пинайте сильно :)) и правда смешно
asm
xor ecx, ecx
mov cx,8
@@1:
ror al, 01
shl ax, 1
shr al, 1
loop @@1;
mov al, ah
not al так просто
end;
Страницы: 1 вся ветка
Текущий архив: 2003.09.11;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.008 c