Форум: "Начинающим";
Текущий архив: 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