![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
перевод из Двоичного кода
Azize © (2007-11-06 15:57:00)Есть ли в Делфи какая-нить ф-я переводящая строку вида '0111000011'
т.е. двоичного в число?
Если есть то какая?
Dib@zol (2007-11-06 20:23:00) [1]Аа, тык сразу нужно было говорить, что надо с конца байты считать.
В этом случае можно вот это
> MOV EBX, EAX;
> DEC EBX;
> XOR EAX, EAX;
> XOR EDX, EDX;
>
> MOV ECX, DWORD PTR [EBX-3];
>
> @loop:
> CMP BYTE PTR [EBX +ECX], '1';
Заменить на вот что:
MOV EBX, EAX;
// DEC EBX;
XOR EAX, EAX;
XOR EDX, EDX;
MOV ECX, DWORD PTR [ EBX-4];
@loop:
CMP BYTE PTR [EBX +EDX], '1';
И вуаля! Функция будет обходить строчку с начала.
Azize (2007-11-06 18:08:00) [2]
> Amoeba © (06.11.07 17:32) [11]
Извиняюсь за причинённое беспокойство
Amoeba (2007-11-06 17:32:00) [3]
> Azize © (06.11.07 17:27) [10]
>
>
> > Dib@zol © (06.11.07 16:55) [8]
>
> не мне нужно наоборот
> т.е не с сонца байты считать а с начала
> т.е.
> '10'=1 а не 2
> ЗЫ: Для построения кодового дерева
>
С этого и надо было начинать свой вопрос.
Azize (2007-11-06 17:27:00) [4]
> Dib@zol © (06.11.07 16:55) [8]
не мне нужно наоборот
т.е не с сонца байты считать а с начала
т.е.
'10'=1 а не 2
ЗЫ: Для построения кодового дерева
Dib@zol (2007-11-06 16:56:00) [5]А лучше - бери моё. Работает в 97 с копейками раз быстрее =D
Dib@zol (2007-11-06 16:55:00) [6]var
test = '1011011100001011';
Твоя функция вместо правильных 46859-ти возвернула мне 53485. Работай ;)
Azize (2007-11-06 16:46:00) [7]Гоню
Function BinStrToWord(s:String):Word;
Var
wrdFor:Word;
Res:Word;
Begin
Res:=0;
for wrdFor := 1 to Length(S) do
begin
Res:=Res+StrToInt(Copy(S,wrdFor,1))*TwoOfN(wrdFor-1);
end;
BinStrToWord:=Res;
end;
Azize (2007-11-06 16:42:00) [8]сделал так
Function TwoOfN(N:Word):Word;
Var
wrdFor:Word;
Res:word;
Begin
Res:=1;
if N>0 then
for wrdFor := 1 to N do
Res:=Res*2;
TwoOfN:=Res;
end;
//------------------------------------------
Function BinStrToWord(s:String):Word;
Var
wrdFor:Word;
Res:Word;
Begin
Res:=0;
for wrdFor := 1 to Length(S) do
begin
Res:=Res+StrToInt(Copy(S,wrdFor,1))*TwoOfN(wrdFor-1);
end;
end;
ЗЫ: Кому интерестно
Dib@zol (2007-11-06 16:28:00) [9]блин. не успел :)
Dib@zol (2007-11-06 16:27:00) [10]function BinToTen(s:string):DWORD;
asm
PUSH EBX;
PUSH ECX;
PUSH EDX;
MOV EBX, EAX;
DEC EBX;
XOR EAX, EAX;
XOR EDX, EDX;
MOV ECX, DWORD PTR [EBX-3];
@loop:
CMP BYTE PTR [EBX+ECX], '1';
JNE @next;
BTS EAX, EDX;
@next:
INC EDX;
LOOP @loop;
POP EDX;
POP ECX;
POP EBX;
end;
Azize (2007-11-06 16:20:00) [11]
> Ega23 © (06.11.07 16:01) [2]
спасибо то что надо
Ega23 (2007-11-06 16:01:00) [12]см. реализацию Classes.BinToHex
переделать не сложно.
Azize (2007-11-06 15:57:00) [13]ЗЫ: в десятичное число