Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.11.25;
Скачать: [xml.tar.bz2];

Вниз

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

 
Галинка ©   (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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.046 c
2-1193987162
Alex8
2007-11-02 10:06
2007.11.25
Набор полей в Query при 3-х таблицах


2-1194165050
savyhinst
2007-11-04 11:30
2007.11.25
Классные константы


15-1192869376
hahol_64_rus
2007-10-20 12:36
2007.11.25
блокнотик


15-1193077784
NAlex
2007-10-22 22:29
2007.11.25
TOpenDialog + куда девается память?


2-1194206035
неугомонный
2007-11-04 22:53
2007.11.25
цвет шрифта toolbutton





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский