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

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

перевод из Двоичного кода


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]

ЗЫ: в десятичное число


Наверх

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