Главная страница
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.02 c
14-33770
Opuhshii
2003-08-23 20:47
2003.09.11
OODB? Каково ваше мнение?


1-33643
Andy BitOff
2003-08-30 21:37
2003.09.11
Передача массива в процедуру.


1-33674
VISA
2003-08-29 16:20
2003.09.11
OnMouseMove на ScrollBar


1-33657
Mohamed
2003-08-29 20:58
2003.09.11
Progress bar


1-33655
qwerty2
2003-09-01 16:39
2003.09.11
Как избавиться от песочных часов в курсоре