Главная страница
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.019 c
3-33483
sash2
2003-08-20 13:21
2003.09.11
Проблема с переносом 3.


9-33420
Анат
2002-10-09 23:19
2003.09.11
Звук


1-33570
isff
2003-09-01 15:23
2003.09.11
dll, изменение в главной форме.


7-33831
Kirill_S
2003-06-12 10:52
2003.09.11
скрыть процесс в Win2000


3-33503
Sheng
2003-08-20 08:57
2003.09.11
Microsoft Jet