Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Можно ли сделать сдвиг одновременно всех символов в строке...


Страницы:   1 2

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;


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо