Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.49 MB
Время: 0.018 c
1-33575
gedd@mail.ru
2003-08-28 17:52
2003.09.11
Кнопка в стиле IE


3-33427
Jean
2003-08-21 22:20
2003.09.11
Access + Excel


7-33833
Antonyan
2003-06-27 12:32
2003.09.11
Exe файл


3-33467
KIR
2003-08-20 15:02
2003.09.11
Транзакции в парадоксе...


7-33823
Zilog
2003-06-16 14:31
2003.09.11
Как можно организовать передачу данных по паре?