Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.15;
Скачать: CL | DM;

Вниз

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

 
Knight ©   (2004-07-27 00:29) [0]

... на определённое количество битов вправо или влево, как единного массива битов, не перебирая её по-символьно?


 
Serge_ ©   (2004-07-27 00:33) [1]

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


 
Serge_ ©   (2004-07-27 00:47) [2]

А максимальный Dword


 
TopT   (2004-07-27 00:53) [3]

Так чтоли?

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;


 
Knight ©   (2004-07-27 00:54) [4]

Ушёл читать свежёскачанную с сайта Анатолия Подгорецкого книгу "Использование ассемблера в Дельфи"... буду перебирать по символьно. Спасибо :)


 
Serge_ ©   (2004-07-27 00:55) [5]

TopT ;)
Побитовый сдвиг.... (shr shl или ror rol)
....


 
Knight ©   (2004-07-27 00:56) [6]


> [3] TopT   (27.07.04 00:53)
> Так чтоли?
> procedure ShiftLeft(var str:string; num:byte);

Одно НО... не по-байтно, а по-битно... :)


 
Serge_ ©   (2004-07-27 00:57) [7]

Knight
Че там читать в паскале есть сдвиги SHL и SHR
но циклические сдвиги не реализованы..(ror rol)


 
Knight ©   (2004-07-27 01:01) [8]


> [7] Serge_ ©   (27.07.04 00:57)
> Че там читать в паскале есть сдвиги SHL и SHR
> но циклические сдвиги не реализованы..(ror rol)

Так надо, чтобы сдвигалась вся строка, как единное целое, т.е. для строки "ABC" => 010000101000100100011... т.е. выпавшие биты надо задвигать в следующий по ходу сдвига байт.


 
Serge_ ©   (2004-07-27 01:03) [9]

Какой максимум размер для строки?


 
Gero ©   (2004-07-27 01:05) [10]


> Какой максимум размер для строки?

string - F1


 
TopT   (2004-07-27 01:05) [11]

Knight ©   (27.07.04 00:56) [6]
>Одно НО... не по-байтно, а по-битно... :)
Невнимательно прочел :)


 
Knight ©   (2004-07-27 01:06) [12]

String... :)
Но, в принципе (для начала), пойдёт и ShortString.


 
Serge_ ©   (2004-07-27 02:38) [13]

Мля ,для твоей строки, а не для 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;


 
Serge_ ©   (2004-07-27 02:55) [14]

Да, имользовать так:
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:56) [15]

Move(c,Pchar(Dword(pp)+Length(s))^,1)
=
Move(c,Pchar(Dword(pp)+Length(s)+1)^,1)


 
Serge_ ©   (2004-07-27 04:30) [16]

Я тама набажил, вот исправленная версия

Побитовый сдвиг вправо..

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 ...


 
Knight ©   (2004-07-27 12:56) [17]

Ну и цены у вас... 8-0
Лучше я сам как-нибудь :)


 
wicked ©   (2004-07-27 13:06) [18]

страхи...
ассемблерные команды shrd, shld - и ваши волосы мягкие и шелковыстые.... :))


 
Anatoly Podgoretsky ©   (2004-07-27 13:24) [19]

Строки по определению это символы, и битах стоит говорить если бы будем называть это байты.

Knight ©   (27.07.04 12:56) [17]
Ты еще не видел наши реальные цены, это пока только крючок.


 
Knight ©   (2004-07-27 13:24) [20]

>> wicked ©   (27.07.04 13:06) [18]
И как это работает?


 
Digitman ©   (2004-07-27 13:29) [21]


> Serge_


размлякался

shrd, shld !!


 
Serge_ ©   (2004-07-29 02:17) [22]

в дельфи
shrd, shld - работает только с 4 байтами одновременно..
+ невозможно узнать значение выпавшего бита...
в случае с асм значение выпавшего бита помещается в CF
а насчет оплаты, я пошутил конечно же...



Страницы: 1 вся ветка

Текущий архив: 2004.08.15;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.023 c
1-1091537647
ligor
2004-08-03 16:54
2004.08.15
combobox и hint


1-1091196704
Antonmm
2004-07-30 18:11
2004.08.15
Зарезервированные слова


14-1091165953
alex_pv
2004-07-30 09:39
2004.08.15
Программеры из Казахстана откликнетесь


1-1091434395
AlexXn
2004-08-02 12:13
2004.08.15
Есть последовательност чисел 1, 2, ... , n


14-1091129107
Rouse_
2004-07-29 23:25
2004.08.15
LOOOOOL !!!! :)))))