Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.11.25;
Скачать: CL | DM;

Вниз

двоичное представление числа   Найти похожие ветки 

 
Галинка ©   (2007-10-30 17:58) [0]

Решение "в лоб":

для целого:
 заводим массив символов длинной 32. Инициализируем все элементы нулями. Остатки от целочесленного деления исходного числа на 2 заносим в обратной последовательности в массив. Выводим массив в нормальном порядке (отметая вывод всех полных "нулевых" байтов).

но это в лоб. Ведь число же и так представлено двоично в компе. Может можно как-то шифтом или масками?


 
Ega23 ©   (2007-10-30 18:08) [1]

когда-то давно было написано и не мной. Для оптимизирования - масса вариантов.

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;


 
Jeer ©   (2007-10-30 18:21) [2]

Так проще:)

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;


 
Anatoly Podgoretsky ©   (2007-10-30 18:33) [3]

> Jeer  (30.10.2007 18:21:02)  [2]

Еще можно выбросить S и Tmp


 
Ega23 ©   (2007-10-30 18:40) [4]


> Jeer ©   (30.10.07 18:21) [2]


вполне возможно.
Это писал один студент, проходивший у нас практику, причём зачем эта функция была ему нужна - я уже и не помню (лет 6 прошло).
функция используется только в его модуле, в остальном надобности в такой штуке не было, поэтому и не трогал.


 
DevilDevil ©   (2007-10-30 18:58) [5]

а так быстрее выполняется:

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;


 
DevilDevil ©   (2007-10-30 19:00) [6]

ну почти так, нужно только перевернуть


 
Efir   (2007-10-30 19:11) [7]

Можно и так:

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;


 
Dimaxx ©   (2007-10-30 21:13) [8]

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;


 
Dimaxx ©   (2007-10-30 21:14) [9]

Тьфу...

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;


 
Галинка ©   (2007-10-31 00:02) [10]

т.е. без массива совсем нельзя?


 
Германн ©   (2007-10-31 01:08) [11]


> Галинка ©   (31.10.07 00:02) [10]
>
> т.е. без массива совсем нельзя?
>

Не понял вопроса. Какой массив имеется в виду?


 
vr-online ©   (2007-10-31 01:32) [12]

а никто не пробовал перевести в двоичную систему число превышающее самый большой тип в делфи? И как это обойти кто - нибудь знает?


 
Германн ©   (2007-10-31 02:03) [13]


> vr-online ©   (31.10.07 01:32) [12]
>
> а никто не пробовал перевести в двоичную систему число превышающее
> самый большой тип в делфи? И как это обойти кто - нибудь
> знает?
>

Ну во-первых, как правильно сказала автор сабжа, в компе всё и так хранится в двоичном виде (0,1). А во-вторых что ты подразумеваешь под
> перевести в двоичную систему число
?


 
Ins ©   (2007-10-31 02:07) [14]


> И как это обойти кто - нибудь знает?

Никаких проблем. Нам нужен только указатель на область памяти, где лежит это длинное целое, и длина буфера. Можно использовать динамический массив.


 
Dimaxx ©   (2007-10-31 02:31) [15]


> т.е. без массива совсем нельзя?

А где ты в [1], [2], [9] видишь массив??


 
Германн ©   (2007-10-31 02:37) [16]


> Ins ©   (31.10.07 02:07) [14]
>
>
> > И как это обойти кто - нибудь знает?
>
> Никаких проблем. Нам нужен только указатель на область памяти,
>  где лежит это длинное целое, и длина буфера. Можно использовать
> динамический массив.
>

Сначало надо придумать как хранить в памяти
> число превышающее самый большой тип в делфи
. А потом уж всё остальное! :)


 
vr-online ©   (2007-10-31 02:59) [17]


> Германн


> Сначало надо придумать как хранить в памяти
> > число превышающее самый большой тип в делфи
> . А потом уж всё остальное! :)

Во-во! Сразу видно, здравомыслящего человека. Ты прав надо придумать как хранить! А вот если нет вариантов? То что? Знаете?


 
vr-online ©   (2007-10-31 03:03) [18]

Кстати а вот кто какие варианты перевода из десятичной в двоичную знает? Все возможные варианты.


 
Германн ©   (2007-10-31 03:16) [19]


> Ты прав надо придумать как хранить! А вот если нет вариантов?
>  То что? Знаете?

Есл нет вариантов, то лучше перейти в offline. :)


 
Германн ©   (2007-10-31 03:21) [20]


> vr-online ©   (31.10.07 03:03) [18]
>
> Кстати а вот кто какие варианты перевода из десятичной в
> двоичную знает? Все возможные варианты.
>

А какие возможны варианты, если твой вопрос непонятен?


 
vr-online ©   (2007-10-31 03:23) [21]

Кому лучше перейти, а кому-то лучше просто подумать. Просто представь что тебе надо перевести из десятичной в двоичну огромное такое число, а архитектура не позволяет, ну может она, то как быть?


 
vr-online ©   (2007-10-31 03:26) [22]

Ну вот на листке бумаги ты как из двоичной в десятичную и обратно переводишь? Всем известный метод деления и записи наоборот - это не единственный вариант. В инете есть еще какие-то. Знаю есть метод дракона работающий с помощю собок. и интересуюсь кто еще и какие методы знает.


 
Virgo_Style ©   (2007-10-31 06:19) [23]

vr-online ©   (31.10.07 3:23) [21]
архитектура


Чья архитектура не позволяет, архитектура программиста, что ли?


 
Галинка ©   (2007-10-31 10:43) [24]

Dimaxx ©   (31.10.07 02:31) [15]

так строка есть массив символов )) Т.е. все равно в массив.

Я думала в таком ключе, типа шифтом сдвигать в право и рассматривать последний бит? Или что-то в этом роде ))


 
Dennis I. Komarov ©   (2007-10-31 10:45) [25]

> [24] Галинка ©   (31.10.07 10:43)

Ну так а хранить двоичное предстваление числа где?


 
Ins ©   (2007-10-31 10:53) [26]


> Сначало надо придумать как хранить в памяти

Уже ;-)


 
Галинка ©   (2007-10-31 10:54) [27]

Dennis I. Komarov ©   (31.10.07 10:45) [25]

так оно и так в двоичном хранится. Как сазать что его не надо тавойт... в десятичное ((


 
Dennis I. Komarov ©   (2007-10-31 10:57) [28]

> [27] Галинка ©   (31.10.07 10:54)

Тебе легче от того, что ты знаешь как оно храниться? Я говорил не про число, а про его представление.


 
Галинка ©   (2007-10-31 11:02) [29]

Dennis I. Komarov ©   (31.10.07 10:57) [28]

да я не против. Просто инетерсно ))


 
Leonid Troyanovsky ©   (2007-10-31 11:25) [30]


> Галинка ©   (31.10.07 10:43) [24]

> Я думала в таком ключе, типа шифтом сдвигать в право и рассматривать
> последний бит? Или что-то в этом роде ))


procedure WriteByteToStr(const b: Byte; buf: PChar);
const
 bs: array [0..$F] of PChar =
   (
     "0000", "0001", "0010", "0011",
     "0100", "0101", "0110", "0111",
     "1000", "1001", "1010", "1011",
     "1100", "1101", "1110", "1111"
   );
begin
 Move(bs[b and $F]^, buf[4], 4);
 Move(bs[b shr 04]^, buf[0], 4);
end;

function BitsToStr(p: PChar; count: Cardinal; Invert: Boolean): String;
var
 i, a: Longint;
 pbase: PChar;
begin
 if Invert then
   begin
     pbase := p + count - 1;
     a := -1;
   end
 else
   begin
     pbase := p;
     a := 1;
   end;
 SetLength(Result, count*8);
 for i := 0 to count - 1 do
   WriteByteToStr(PByte(pbase + a*i)^, @Result[i*8 + 1]);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 L: Longint;
begin
 L := StrToInt(Edit1.Text);
 Caption := BitsToStr(@L, 4, True);
end;

Не тестировалось.

--
Regards, LVT.


 
Anatoly Podgoretsky ©   (2007-10-31 13:05) [31]


> vr-online ©   (31.10.07 03:23) [21]

Неужели в 2 гб не поместится?


 
Dimaxx ©   (2007-10-31 13:23) [32]


> так строка есть массив символов )) Т.е. все равно в массив.
>
> Я думала в таком ключе, типа шифтом сдвигать в право и рассматривать
> последний бит? Или что-то в этом роде ))

Ты опиши точнее - что тебе требуется сделать. Если простая проверка, так проще одной строкой.

if (Num and (1 shl I))<>0 then S:="1" else S:="0";

Проверяется I-тый бит в Num.


 
vr-online ©   (2007-10-31 16:24) [33]

НОВЫЙ ВАРИАНТ!!! ВНИМАНИЕ!!! ТОЛЬКО ДЛЯ ИЗВРЩЕНЦОВ!!!

procedure TForm1.Button1Click(Sender: TObject);
var
i1, i2, i3, i4, i5      : integer;
i6, i7, i8, i9, i10     : integer;
i11, i12, i13, i14, i15 : integer;
i16 : integer;
k : integer;
str: string;
begin
k:=-1;
for i1:= 0 to 1 do
 for i2:= 0 to 1 do
  for i3:= 0 to 1 do
   for i4:= 0 to 1 do
    for i5:= 0 to 1 do
     for i6:= 0 to 1 do
      for i7:= 0 to 1 do
       for i8:= 0 to 1 do
        for i9:= 0 to 1 do
         for i10:= 0 to 1 do
          for i11:= 0 to 1 do
           for i12:= 0 to 1 do
            for i13:= 0 to 1 do
             for i14:= 0 to 1 do
              for i15:= 0 to 1 do
               for i16:= 0 to 1 do
               begin
               k:=k+1;
               str:=IntToStr(i1)+IntToStr(i2)+
                    IntToStr(i3)+IntToStr(i4)+
                    IntToStr(i5)+IntToStr(i6)+
                    IntToStr(i7)+IntToStr(i8)+
                    IntToStr(i9)+IntToStr(i10)+
                    IntToStr(i11)+IntToStr(i12)+
                    IntToStr(i13)+IntToStr(i14)+
                    IntToStr(i15)+IntToStr(i16);
               if pos("0",str)<>0 then
               delete(str,pos("0",str), pos("1",str)-1);
               memo1.Lines.Add(IntToStr(k)+": " + str);
               end;
end;


 
Anatoly Podgoretsky ©   (2007-10-31 16:41) [34]

> vr-online  (31.10.2007 16:24:33)  [33]

Здесь таких нет


 
vr-online ©   (2007-10-31 17:31) [35]


> Anatoly Podgoretsky ©   (31.10.07 16:41)


> Здесь таких нет - ах если бы


Эх.. зря ты так думаешь...


 
Anatoly Podgoretsky ©   (2007-10-31 19:28) [36]

Не надо в цитаты включать отсебятину.


 
vr-online ©   (2007-10-31 20:21) [37]


> Не надо в цитаты включать отсебятину. хорошо :)



Страницы: 1 вся ветка

Текущий архив: 2007.11.25;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.019 c
3-1184316065
Сатир
2007-07-13 12:41
2007.11.25
Invalid typecast


2-1193815331
СержК
2007-10-31 10:22
2007.11.25
Как "равернуть" грид (что-то типа Orientation=Horizontal)


15-1192920134
Прочее
2007-10-21 02:42
2007.11.25
Как сделать чтобы в OnKeyPress проходило сообщение VK_UP ?


2-1193827989
F@T@L_Err0r
2007-10-31 13:53
2007.11.25
Скопировать папку


2-1194034973
неугомонный
2007-11-02 23:22
2007.11.25
scrollbar stringgrid