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

Вниз

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

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

Наверх





Память: 0.51 MB
Время: 0.036 c
14-1090930907
peypivo
2004-07-27 16:21
2004.08.15
Explorer


1-1091510617
race1
2004-08-03 09:23
2004.08.15
pointers


1-1091258938
Antonmm
2004-07-31 11:28
2004.08.15
Открытие файла в RichEdit


1-1091199487
Studentik
2004-07-30 18:58
2004.08.15
Стиль XP в WinXP


14-1090830171
Типа гость
2004-07-26 12:22
2004.08.15
О копирайтах





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский