Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.09.11;
Скачать: [xml.tar.bz2];

Вниз

как зеркально переставить биты ...   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.008 c
1-33657
Mohamed
2003-08-29 20:58
2003.09.11
Progress bar


3-33452
lex7
2003-08-21 13:27
2003.09.11
ADO SQL


6-33712
Skywalker
2003-07-08 16:11
2003.09.11
Как работает веб-сервер?


6-33720
vajo
2003-07-02 14:42
2003.09.11
Приём параметров в консольном приложении


9-33425
cyborg
2003-03-07 02:38
2003.09.11
Конвертер из 24 битовых BMP в 16 битовый формат





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский