![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Можно ли сделать сдвиг одновременно всех символов в строке...
Knight © (2004-07-27 00:29:00)... на определённое количество битов вправо или влево, как единного массива битов, не перебирая её по-символьно?
Serge_ (2004-07-29 02:17:00) [1]в дельфи
shrd, shld - работает только с 4 байтами одновременно..
+ невозможно узнать значение выпавшего бита...
в случае с асм значение выпавшего бита помещается в CF
а насчет оплаты, я пошутил конечно же...
Digitman (2004-07-27 13:29:00) [2]
> Serge_
раз млякался
shrd, shld !!
Knight (2004-07-27 13:24:00) [3]>> wicked © (27.07.04 13:06) [18]
И как это работает?
Anatoly Podgoretsky (2004-07-27 13:24:00) [4]Строки по определению это символы, и битах стоит говорить если бы будем называть это байты.
Knight © (27.07.04 12:56) [17]
Ты еще не видел наши реальные цены, это пока только крючок.
wicked (2004-07-27 13:06:00) [5]страхи...
ассемблерные команды shrd, shld - и ваши волосы мягкие и шелковыстые.... :))
Knight (2004-07-27 12:56:00) [6]Ну и цены у вас... 8-0
Лучше я сам как-нибудь :)
Serge_ (2004-07-27 04:30:00) [7]Я тама набажил, вот исправленная версия
Побитовый сдвиг вправо..
Function SHRMem(p:pointer;sz:dword):pointer;assembler;stdcall;
const
DOSetFirstBit_1:byte=128;
DOSetFirstBit_0:byte=127;
asm
push esi
push edi
push ebx
push edx
mov esi,p
mov edi,esi
xor cl,cl
mov ebx,sz
@SHRLoop:
xor edx,edx
lodsb
shr al,1
setc dl
test cl,cl
jnz @Addbit_1
jmp @Addbit_0
@AddBit_1:
or al,DOSetFirstBit_1
jmp @Continue_1
@Addbit_0:
and al,DOSetFirstBit_0
@Continue_1:
stosb
dec ebx
test ebx,ebx
jz @Done
mov cl,dl
jmp @SHRLoop
@Done:
pop edx
pop ebx
pop edi
pop esi
mov eax,p
end;
И циклический побитовый сдвиг вправо
Function RORMem(p:pointer;sz:dword):pointer;assembler;stdcall;
const
DOSetFirstBit_1:byte=128;
DOSetFirstBit_0:byte=127;
asm
push esi
push edi
push ebx
push edx
mov esi,p
mov edi,esi
xor cl,cl
mov ebx,sz
@SHRLoop:
xor edx,edx
lodsb
shr al,1
setc dl
test cl,cl
jnz @Addbit_1
jmp @Addbit_0
@AddBit_1:
or al,DOSetFirstBit_1
jmp @Continue_1
@Addbit_0:
and al,DOSetFirstBit_0
@Continue_1:
stosb
dec ebx
test ebx,ebx
jz @Done
mov cl,dl
jmp @SHRLoop
@Done:
test dl,dl
jz @Continue_2
mov esi,p
mov edi,esi
lodsb
or al,DOSetFirstBit_1
stosb
@Continue_2:
pop edx
pop ebx
pop edi
pop esi
mov eax,p
end;
И того уже $200 ...
Serge_ (2004-07-27 02:56:00) [8]Move(c,Pchar(Dword(pp)+Length(s))^,1)
=
Move(c,Pchar(Dword(pp)+Length(s)+1)^,1)
Serge_ (2004-07-27 02:55:00) [9]Да, имользовать так:
const s='ANY_STRING_MAYBE_FUCKIN_BIG';
var p:pointer;
function PrepareString;
begin
GetMem(p,Length(S));
Move(Pchar(s)^,p^,Length(s));
end;
procedure SHRIt;
begin
ShrMEM(p,Length(S));
end;
procedure TForm1.button1Click(Sender:tobject);;
const c:char=#0;
var ShredString:string;
pp:pchar;
begin
ShrIT;
GetMem(pp,Length(S)+1);
Move(p^,pp^,Length(s));
Move(c,Pchar(Dword(pp)+Length(s))^,1)
ShredString:=pp;
Freemem(pp);
end;
procedure TForm1.FormCreate(Sender:tobject);
begin
preparestring;
end;
Serge_ (2004-07-27 02:38:00) [10]Мля ,для твоей строки, а не для string...)
Короче ты мне 100$ должен, мля
Сдвиг вправо
Function SHRMem(p:pointer;sz:dword):pointer;assembler;stdcall;
const
DOSetFirstBit_1:byte=128;
DOSetFirstBit_0:byte=127;
asm
push esi
push edi
push ebx
push edx
mov esi,p
mov edi,esi
xor cl,cl
mov ebx,sz
@SHRLoop:
xor edx,edx
lodsb
shr al,1
setc dl
test cl,cl
jnz @Addbit_1
jmp @Addbit_0
@AddBit_1:
or al,DOSetFirstBit_1
jmp @Continue_1
@Addbit_0:
and al,DOSetFirstBit_0
@Continue_1:
stosb
test ebx,ebx
jz @Done
dec ebx
mov cl,dl
jmp @SHRLoop
@Done:
pop edx
pop ebx
pop edi
pop esi
mov eax,p
end;
Knight (2004-07-27 01:06:00) [11]String... :)
Но, в принципе (для начала), пойдёт и ShortString.
TopT (2004-07-27 01:05:00) [12]Knight © (27.07.04 00:56) [6]
>Одно НО... не по-байтно, а по-битно... :)
Невнимательно прочел :)
Gero (2004-07-27 01:05:00) [13]
> Какой максимум размер для строки?
string - F1
Serge_ (2004-07-27 01:03:00) [14]Какой максимум размер для строки?
Knight (2004-07-27 01:01:00) [15]
> [7] Serge_ © (27.07.04 00:57)
> Че там читать в паскале есть сдвиги SHL и SHR
> но циклические сдвиги не реализованы..(ror rol)
Так надо, чтобы сдвигалась вся строка, как единное целое, т.е. для строки 'ABC' => 010000101000100100011... т.е. выпавшие биты надо задвигать в следующий по ходу сдвига байт.
Serge_ (2004-07-27 00:57:00) [16]Knight
Че там читать в паскале есть сдвиги SHL и SHR
но циклические сдвиги не реализованы..(ror rol)
Knight (2004-07-27 00:56:00) [17]
> [3] TopT (27.07.04 00:53)
> Так чтоли?
> procedure ShiftLeft(var str:string; num:byte);
Одно НО... не по-байтно, а по-битно... :)
Serge_ (2004-07-27 00:55:00) [18]TopT ;)
Побитовый сдвиг.... (shr shl или ror rol)
....
Knight (2004-07-27 00:54:00) [19]Ушёл читать свежёскачанную с сайта Анатолия Подгорецкого книгу "Использование ассемблера в Дельфи"... буду перебирать по символьно. Спасибо :)
TopT (2004-07-27 00:53:00) [20]Так чтоли?
procedure ShiftLeft(var str:string; num:byte);
begin
Str:=Copy(str,num+1,Length(str)-num)+Copy(str,1,num);
end;
Так выпавшие за пределы (за начало) стринга знаки приклеются к концу. Тоесть если была строка str:=1234567890;
То после ShiftLeft(str,3); получим что str равен 4567890123. Если выпавшие за пределы знаки перемещать в конец не надо, то+Copy(str,1,num)нужно удалить.
PS Подобным путем реализуется и ShiftRight;