![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сравнение двоичных чисел
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