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

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

двоичное представление числа


Страницы:   1 2

Галинка ©   (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;


Страницы:   1 2

Наверх

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