![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
двоичное представление числа
Галинка © (2007-10-30 17:58:00)Решение "в лоб":
для целого:
заводим массив символов длинной 32. Инициализируем все элементы нулями. Остатки от целочесленного деления исходного числа на 2 заносим в обратной последовательности в массив. Выводим массив в нормальном порядке (отметая вывод всех полных "нулевых" байтов).
но это в лоб. Ведь число же и так представлено двоично в компе. Может можно как-то шифтом или масками?
vr-online (2007-10-31 02:59:00) [21]
> Германн
> Сначало надо придумать как хранить в памяти
> > число превышающее самый большой тип в делфи
> . А потом уж всё остальное! :)
Во-во! Сразу видно, здравомыслящего человека. Ты прав надо придумать как хранить! А вот если нет вариантов? То что? Знаете?
Германн (2007-10-31 02:37:00) [22]
> Ins © (31.10.07 02:07) [14]
>
>
> > И как это обойти кто - нибудь знает?
>
> Никаких проблем. Нам нужен только указатель на область памяти,
> где лежит это длинное целое, и длина буфера. Можно использовать
> динамический массив.
>
Сначало надо придумать как хранить в памяти
> число превышающее самый большой тип в делфи
. А потом уж всё остальное! :)
Dimaxx (2007-10-31 02:31:00) [23]
> т.е. без массива совсем нельзя?
А где ты в [1], [2], [9] видишь массив??
Ins (2007-10-31 02:07:00) [24]
> И как это обойти кто - нибудь знает?
Никаких проблем. Нам нужен только указатель на область памяти, где лежит это длинное целое, и длина буфера. Можно использовать динамический массив.
Германн (2007-10-31 02:03:00) [25]
> vr-online © (31.10.07 01:32) [12]
>
> а никто не пробовал перевести в двоичную систему число превышающее
> самый большой тип в делфи? И как это обойти кто - нибудь
> знает?
>
Ну во-первых, как правильно сказала автор сабжа, в компе всё и так хранится в двоичном виде (0,1). А во-вторых что ты подразумеваешь под
> перевести в двоичную систему число
?
vr-online (2007-10-31 01:32:00) [26]а никто не пробовал перевести в двоичную систему число превышающее самый большой тип в делфи? И как это обойти кто - нибудь знает?
Германн (2007-10-31 01:08:00) [27]
> Галинка © (31.10.07 00:02) [10]
>
> т.е. без массива совсем нельзя?
>
Не понял вопроса. Какой массив имеется в виду?
Галинка (2007-10-31 00:02:00) [28]т.е. без массива совсем нельзя?
Dimaxx (2007-10-30 21:14:00) [29]Тьфу...
function IntToBin(int: integer): string;
var i,j: integer;
begin
Result:='';
j:=int;
for i:=0 to 31 do
begin
Result:=Chr((j and 1)+48)+Result;
j:=j shr 1;
end;
end;
Dimaxx (2007-10-30 21:13:00) [30]function IntToBin(int: integer): string;
var i,j: integer;
begin
Result:='';
j:=int;
for i:=0 to 31 do
begin
S:=Chr((j and 1)+48)+S;
j:=j shr 1;
end;
end;
Efir (2007-10-30 19:11:00) [31]Можно и так:
function IntToBin(int:integer):string;
var
i:integer;
s:string;
begin
s:='';
i:=31;
repeat
i:=i-1;
if ((int shr i) and 1)>0 then begin
for i:=i downto 0 do s:=s+IntToStr((int shr i) and 1);
Break;
end;
until i<0;
Result:=s;
end;
DevilDevil (2007-10-30 19:00:00) [32]ну почти так, нужно только перевернуть
DevilDevil (2007-10-30 18:58:00) [33]а так быстрее выполняется:
function IntToBin(X : integer) : string;
var
Buf : array[0..33] of char;
Sign : boolean;
i : integer;
begin
if X = 0 then
begin
Result := '0';
exit;
end;
Sign := (X < 0);
X := abs(X);
FillChar(Buf, 33, '0');
for i := 0 to 31 do
if (X and (i shl i) <> 0 ) then Buf[i+1] := '1';
for i := 32 downto 1 do
if Buf[i] <> '0' then
begin
Buf[i+1] := #0;
break;
end;
if Sign then
begin
Buf[0] := '-';
Result := @Buf[0];
end
else Result := @Buf[1];
end;
Ega23 (2007-10-30 18:40:00) [34]
> Jeer © (30.10.07 18:21) [2]
вполне возможно.
Это писал один студент, проходивший у нас практику, причём зачем эта функция была ему нужна - я уже и не помню (лет 6 прошло).
функция используется только в его модуле, в остальном надобности в такой штуке не было, поэтому и не трогал.
Anatoly Podgoretsky (2007-10-30 18:33:00) [35]> Jeer (30.10.2007 18:21:02) [2]
Еще можно выбросить S и Tmp
Jeer (2007-10-30 18:21:00) [36]Так проще:)
function IntToBinStr_(Value: Int64; Digits: Integer): String;
var
S: String;
tmp: int64;
begin
S := '';
while Digits > 0 do
begin
if Odd(Value) then S := '1' + S else S := '0' + S;
tmp := Value shr 1;
Value := tmp;
Dec(Digits);
end;
Result := S;
end;
Ega23 (2007-10-30 18:08:00) [37]когда-то давно было написано и не мной. Для оптимизирования - масса вариантов.
Function DecToBin(Dec : integer) : string;
Var
New : string;
// NewTemp : Char;
Temp, x : integer;
begin
// Temp := 0;
Result := '';
while Dec > 1 do
begin
Temp := Dec div 2;
if Dec - Temp * 2 = 0 then Result := Result + '0'
else
Result := Result + '1';
Dec := Temp;
end;
if Dec = 1 then Result := Result + '1';
New := '';
if Length(Result) <> 8 then
for x := Length(Result) to 8 do
Result := Result + '0';
Result:=Copy(Result,1,8);
for x := Length(Result) downto 1 do
New := New + Result[x];
DecToBin := New;
{DecToBin:=Result;}
end;