Форум: "Основная";
Текущий архив: 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.035 c