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

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

Сравнение двоичных чисел


Страницы:   1 2

Delphman ©   (2005-10-13 22:04:00) 

Допустим есть число (двоичное) заданное строкой типа string s='10001111'
Как автоматизировать следующий процесс:
Эта строка делится пополам и сравнивается:
1000<=1111
затем делится так (от цендра или концов не важно):
   00<=11
10    <=   11
затем так:
1      <=      1
 0    <=    1
   0  <=  1
     0<=1

Длина строки равна 2^n, n=2,3,4...26

Можно ли такое сделать? Чё то в голову ничего не приходит.


Fay   (2005-10-14 11:17:00) [21]

2 Игорь Шевченко ©   (14.10.05 11:07) [6]
Вы пессимист 8)


Игорь Шевченко   (2005-10-14 11:07:00) [22]

Fay ©   (14.10.05 01:12) [4]

function BinToDecimal(const s : String) : DWORD;
var
I: Integer;
begin
Result := 0;
for i := 1 to Length(s) do
  if S[I] in ['0','1'] then
    Result := (Result shl 1) + (Ord(S[I]) - Ord('0'));
  else
    raise EConvertError.CreateFmt ('Illegal character %c', [S[I]]);
end;


?


Fay   (2005-10-14 10:57:00) [23]

Delphman   (13.10.05 22:04)
затем делится так (от цендра или концов не важно):
  00<=11
10    <=   11
затем так:
1      <=      1
0    <=    1
  0  <=  1
    0<=1


Чё это значит?


Fay   (2005-10-14 01:12:00) [24]

2 ArtemESC ©   (14.10.05 0:19) [3]
Сравни.

uses
 Math;

{$DEFINE ArtemESC}

{$IFDEF ArtemESC}

function BinToDecimal(str : string) : DWORD;
var
 len : integer;
 i : integer;
begin
 len := length(str);
 Result := 0;
 for i := 1 to len do
   if (str[i] = '1') then Result := Result + Round(IntPower(2, len - i));
end;

{$ELSE}

function BinToDecimal(const s : String) : DWORD;
var
 i, n : Integer;
begin
 Result := 0;
 n := Length(s);
 for i := 1 to n do
   if (s[i] = '1') then
     Result := Result or DWORD($01 shl (n - i));
end;
{$ENDIF}

{$R *.dfm}

procedure TForm1.Button1Click(Sender : TObject);
const
 TEST_STR = '010101010101010101010101010101';
var
 pf, pc1, pc2 : Int64;
 i : Integer;
 s : String;
begin
 s := TEST_STR;
 QueryPerformanceFrequency(pf);
 QueryPerformanceCounter(pc1);
 for i := 0 to 999999 do
   BinToDecimal(s);
 QueryPerformanceCounter(pc2);
 ShowMessage(Format('%d ms', [((pc2 - pc1) * 1000) div pf]))
end;


P.S.
Нафиг ваще потребовался сопр?


ArtemESC   (2005-10-14 00:19:00) [25]

>>Игорь Шевченко
А что не так?


Игорь Шевченко   (2005-10-14 00:06:00) [26]

ArtemESC ©   (13.10.05 22:47) [1]

Откуда пример, если не секрет ?


ArtemESC   (2005-10-13 22:47:00) [27]

1)Перевод числа из двоичного в десятичное (если нужно)

function BinToDecimal(str: string): DWORD;
var
len: integer;
i  : integer;
begin
len     := length(str);
Result  := 0;
for i := 1 to len do
  If (str[i] = '1') then Result := Result + Round(IntPower(2, len - i));
end;


2)+ НесложныеМанипуляции с shl и shr


Страницы:   1 2

Наверх

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