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

Вниз

dec->bin   Найти похожие ветки 

 
Наталья   (2013-01-28 17:31) [0]

Из dec->hex:
Format("%.0x",[DEC]);

а в двоичную систему через Format можно?


 
Сергей М. ©   (2013-01-28 17:51) [1]

Нельзя


 
Dennis I. Komarov ©   (2013-01-28 20:59) [2]

Зачем?


 
Jeer ©   (2013-01-28 23:55) [3]

IntToHex() - > HexToBin()


 
ALS   (2013-01-29 09:47) [4]

function _ltoa (Value: Integer; Buffer: PChar; Radix: Integer): PChar; cdecl; external "ntdll.dll" name "_ltoa";

function Int2Str(Data: integer; Radix: integer = 2): string;
var Buffer: array[0..32] of char;
begin
 Result := _ltoa(Data, Buffer, Radix)
end;


 
megavoid ©   (2013-01-29 10:06) [5]

Я за [3], а то представляю, сейчас Наталья как принесёт преподу cdecl; external ntdll.dll :)


 
brother ©   (2013-01-29 10:08) [6]

> Наталья как принесёт преподу cdecl; external ntdll.dll

а у того линух)


 
Anatoly Pogoretsky   (2013-01-29 10:31) [7]

> brother  (29.01.2013 10:08:06)  [6]

Лопух правильное
написание


 
ALS   (2013-01-29 11:15) [8]

Jeer ©   (28.01.13 23:55) [3]
IntToHex() - > HexToBin()


В чем смысл операции?
Получить в результате число, которое запровлялось в IntToHex() ???
Бинарное значение у автора есть (DEC), требуется строка


 
Jeer ©   (2013-01-29 12:40) [9]


> В чем смысл операции?


В использовании стандартных функций.


 
aka   (2013-01-29 12:42) [10]


> Наталья   (28.01.13 17:31)
>
> Из dec->hex:
> Format("%.0x",[DEC]);
>
> а в двоичную систему через Format можно?


dec->bin
вот моя самописная:


function TMainForm.DecToBin(Dec: Integer): String;
var
 Res,i,j: Integer;
 Dest: array[0..255] of Char;
 Buf: Char;
begin
 if Dec <= 0 then
 begin
   Result := "0";
   Exit;
 end;

 i := -1;
 Res := Dec;

 while Res > 0 do
 begin
   Inc(i);
   if (Res mod 2) = 0 then Dest[i] := "0"
   else Dest[i] := "1";

   Res := Res div 2;
 end;

 for j := 0 to (i div 2) do
 begin
   Buf := Dest[j];
   Dest[j] := Dest[i-j];
   Dest[i-j] := Buf;
 end;

 Result := Copy(Dest,0,i+1);
end;


 
aka   (2013-01-29 12:43) [11]


> Jeer ©   (29.01.13 12:40) [9]


Стандартной из 10 в 2 нет.


 
Наталья   (2013-01-29 13:10) [12]


> aka   (29.01.13 12:42) [10]


А как с ведущими нулями сделать?


 
aka   (2013-01-29 13:18) [13]


> Наталья   (29.01.13 13:10) [12]
>
>
> > aka   (29.01.13 12:42) [10]
>
>
> А как с ведущими нулями сделать?


через установку Capacity, если не нужно, то Capacity <= 0


function TMainForm.DecToBin(Dec: Integer; Capacity: Integer): String;
var
 Res,i,j: Integer;
 Dest: array[0..255] of Char;
 Buf: Char;
begin
 if Dec <= 0 then
 begin
   Result := StringOfChar("0", Capacity);
   Exit;
 end;

 i := -1;
 Res := Dec;

 while Res > 0 do
 begin
   Inc(i);
   if (Res mod 2) = 0 then Dest[i] := "0"
   else Dest[i] := "1";

   Res := Res div 2;
 end;

 for j := 0 to (i div 2) do
 begin
   Buf := Dest[j];
   Dest[j] := Dest[i-j];
   Dest[i-j] := Buf;
 end;

 Result := StringOfChar("0", Capacity-(i+1)) + Copy(Dest,0,i+1);
end;


 
Ega23 ©   (2013-01-29 13:21) [14]


> А как с ведущими нулями сделать?


function IntToBin(Value: Integer): string;
var
 i: Integer;
const
 cDigit: array[False..True] of Char = ("0", "1");
 cSize = SizeOf(Integer) * 8;
begin
 SetLength(Result, cSize);
 for i := 0 to cSize - 1 do
   Result[cSize - i] := cDigit[((Value shr i) and 1) = 1];
end;


 
Ega23 ©   (2013-01-29 13:38) [15]


> aka   (29.01.13 13:18) [13]

>   if Dec <= 0 then
>   begin
>     Result := StringOfChar("0", Capacity);
>     Exit;
>   end;


Неверно. "-1" у Integer - это 32 единицы.


 
aka   (2013-01-29 13:48) [16]

if Dec <= 0 then
 begin
   Result := "0" + StringOfChar("0", Capacity-1);
   Exit;
 end;


 
Ega23 ©   (2013-01-29 13:53) [17]


> aka   (29.01.13 13:48) [16]


И? Вот я вызываю твою функцию:

Label1.Caption := DecToBin(-1, 0);
Я вижу "0". А должен увидеть 32 единицы (для 32-х разрядов, естественно).


 
aka   (2013-01-29 13:57) [18]


> Ega23 ©   (29.01.13 13:53) [17]


Функция вообще для положительных целых.

И? Вызывают стандартный вин-калькулятор, ввожу "-1", перевожу в Bin - вижу "0"


 
Ega23 ©   (2013-01-29 14:00) [19]


> Функция вообще для положительных целых.

У тебя либо 0, либо единица. То, что у знаковых целых первый бит за знак отвечает не означает того, что он перестал быть нулём или единицей.


> И? Вызывают стандартный вин-калькулятор, ввожу "-1", перевожу
> в Bin - вижу "0"

Я вижу кучу единиц. Что я делаю не так?


 
Ega23 ©   (2013-01-29 14:00) [20]


> И? Вызывают стандартный вин-калькулятор, ввожу "-1", перевожу
> в Bin - вижу "0"


А, я кажется понял. После ввода "-1" равенство нажми. И уже потом в bin.


 
aka   (2013-01-29 14:20) [21]


> А, я кажется понял. После ввода "-1" равенство нажми. И
> уже потом в bin.


нажму "="  получится "0", а 0 в 0 = 0.


> > И? Вызывают стандартный вин-калькулятор, ввожу "-1", перевожу
> > в Bin - вижу "0"
>
> Я вижу кучу единиц. Что я делаю не так?


Калькуляторы разные наверно.


 
Jeer ©   (2013-01-29 14:28) [22]


> aka   (29.01.13 12:43) [11]
>
>
> > Jeer ©   (29.01.13 12:40) [9]
>
>
> Стандартной из 10 в 2 нет.


С логикой плохо?
Приведены стандартные функции, т.к. Наталье до самописных далеко.


 
Anatoly Podgoretsky ©   (2013-01-29 14:29) [23]


> Неверно. "-1" у Integer - это 32 единицы.

Нельзя использовать -1 для беззнаковых чисел, как и : Integer

BINary вообще то беззнаковое


 
aka   (2013-01-29 14:30) [24]


> Jeer ©   (29.01.13 14:28) [22]


Мы вообще щас писать будет из десятичной в произвольную.


 
Ega23 ©   (2013-01-29 14:30) [25]


> Калькуляторы разные наверно.

стандартный calc.exe
Ну да ладно, можешь упорствовать дальше, ненаказуемо. Я в [14] уже сказал всё что хотел.


 
Jeer ©   (2013-01-29 14:32) [26]

Удалено модератором


 
Ega23 ©   (2013-01-29 14:33) [27]


> Нельзя использовать -1 для беззнаковых чисел, как и : Integer

Какая разница? Есть число. Число представлено в виде набора нулей и единиц. Какая половая разница, как оно там "выше" трактуется, как "4294967295" или как "-1"? Один фиг это 32 единицы.


 
Игорь Шевченко ©   (2013-01-29 14:34) [28]

Ega23 ©   (29.01.13 13:21) [14]


> array[False..True]


Ужос на крыльях ночи. Напиши array[Boolean] и не порть людям голову :)


 
aka   (2013-01-29 14:35) [29]


> Ega23 ©   (29.01.13 14:30) [25]


Так если мы переводим "-1" из десятичной в двоичную, то какой ответ?


 
Ega23 ©   (2013-01-29 14:38) [30]


> Ужос на крыльях ночи. Напиши array[Boolean] и не порть людям
> голову :)

Да я вот чё-та забываю всё время, кто у них там первый, True или False. Несколько раз накололся, когда местами менял, потом плюнул слюной и уже чётко пишу, что именно

Кстати, там вообще можно так
cDigit: array[0..1] of Char = ("0", "1");

 Result[cSize - i] := cDigit[(Value shr i) and 1];


 
Ega23 ©   (2013-01-29 14:43) [31]


> Так если мы переводим "-1" из десятичной в двоичную, то
> какой ответ?

На, смотри:

http://ega23.narod.ru/pix/calc.png


 
Плохиш ©   (2013-01-29 14:46) [32]


> Так если мы переводим "-1" из десятичной в двоичную, то
> какой ответ?

Много единиц.


 
RWolf ©   (2013-01-29 14:49) [33]


> Да я вот чё-та забываю всё время, кто у них там первый,
> True или False.

Правда выше лжи, очевидно же.


 
Игорь Шевченко ©   (2013-01-29 14:50) [34]

Ega23 ©   (29.01.13 14:38) [30]

Сейчас придет Sha и скажет


 
Ega23 ©   (2013-01-29 14:51) [35]


> Правда выше лжи, очевидно же.

Я с вероятностью в 70% в цикле
 while not DataSet.Eof do
 begin
   ...
 end;


забываю DataSet.Next поставить. Вот забываю и всё, хоть убей. Оно понятно, что сразу отлавливается, но тем не менее.
Тут - ровно то же самое.


 
Ega23 ©   (2013-01-29 14:53) [36]


> Сейчас придет Sha и скажет

Само-собой, щас ещё Розыч начнёт выступать :))


 
Anatoly Pogoretsky   (2013-01-29 15:02) [37]

> Ega23  (29.01.2013 14:33:27)  [27]

Для без знакового будет
ерунда, а для знакового
ошибка,
В общему будет плохо


 
Anatoly Pogoretsky   (2013-01-29 15:04) [38]

> Ega23  (29.01.2013 14:43:31)  [31]

Калькулятор он разумный,
не в пример программерам, а
этот особо разумный,
работает с 2^128


 
Anatoly Pogoretsky   (2013-01-29 15:05) [39]

> Игорь Шевченко  (29.01.2013 14:50:34)  [34]

А может по шапке надоет


 
Anatoly Pogoretsky   (2013-01-29 15:07) [40]

> Ega23  (29.01.2013 14:51:35)  [35]

False всегда НОЛЬ, а прочих
много, но правило True not False (not
логический)


 
Anatoly Pogoretsky   (2013-01-29 15:07) [41]

> Ega23  (29.01.2013 14:53:36)  [36]

А им помощь нужна?


 
Ega23 ©   (2013-01-29 15:11) [42]


> False всегда НОЛЬ, а прочих

Я в курсе, что ТруЪ - это не ноль. Но оно не мешает мне каждый раз путать значения местами. :)


 
Игорь Шевченко ©   (2013-01-29 15:42) [43]

Для скорости нужна таблица из 16 строковых представлений на каждый ниббл. И сдвигать на 4 бита


 
Ega23 ©   (2013-01-29 16:07) [44]


> Для скорости нужна таблица из 16 строковых представлений
> на каждый ниббл. И сдвигать на 4 бита

А почему 16? Тогда уж на байт сразу, не?


 
Anatoly Pogoretsky   (2013-01-29 16:25) [45]

> Ega23  (29.01.2013 16:07:44)  [44]

Ну просто тут начинает
жаба давить, а так конечно
лучше


 
MBo ©   (2013-01-29 16:30) [46]

>Игорь Шевченко ©   (29.01.13 15:42) [43]
Попробовал - получается скорость в 2.3 раза (при выводе 32 бит) выше, чему у функции IntToBin из модуля IdGlobalProtocols. В общем-то, вряд ли овчинка стоит выделки, в программе найдутся более узкие места ;)

 function IntToBinString(AValue: Integer;
   BitsToShow: Integer = SizeOf(Integer) * 8): string;
 const
   BitsStrings: array [0 .. 15] of string =
     ("0000", "0001", "0010", "0011",
      "0100", "0101", "0110", "0111",
      "1000", "1001", "1010", "1011",
      "1100", "1101", "1110", "1111");
 var
   pc: PChar;
 begin
   SetLength(Result, BitsToShow);
   pc := @PChar(Result)[0];
   while BitsToShow >= 4 do begin
     Move(Pointer(BitsStrings[AValue and $F])^, pc[BitsToShow - 4], 4 * SizeOf(Char));
     AValue := AValue shr 4;
     dec(BitsToShow, 4);
   end;
   if BitsToShow > 0 then
     Move(Pointer(BitsStrings[AValue and $F])^, pc[0], BitsToShow * SizeOf(Char));
 end;


 
Игорь Шевченко ©   (2013-01-29 17:21) [47]

MBo ©   (29.01.13 16:30) [46]

Сейчас придет Sha и скажет :)


 
Anatoly Pogoretsky   (2013-01-29 17:34) [48]

> Игорь Шевченко  (29.01.2013 17:21:47)  [47]

> Сейчас придет Sha и скажет :)

Сейчас придет Sha и всех
разгонит


 
MBo ©   (2013-01-29 17:56) [49]

>Сейчас придет Sha и скажет :)
Ага ;)
От всяких UniqueString я избавился, и 56% времени занимает SetLength под результат. Но резервы, наверно, изыскать можно.

P.S. В последней строчке ошибочка вкралась (мне иногда приходится выводить, например, 14 бит)

Move(Pointer(@BitsStrings[AValue and $F][5 - BitsToShow])^, pc[0], BitsToShow * SizeOf(Char));


 
Игорь Шевченко ©   (2013-01-29 18:03) [50]

MBo ©   (29.01.13 17:56) [49]

Кстати, а зачем array of string, а не array of PChar ?

мне непривычно приведение к типу Pointer


 
brother ©   (2013-01-29 18:15) [51]

> а зачем array of string

имхо, эти константы забивать прощще)


 
MBo ©   (2013-01-29 18:17) [52]

>Кстати, а зачем array of string, а не array of PChar ?
Привычнее как-то. Это ни на что не влияет

>мне непривычно приведение к типу Pointer
В данном случае -  с константами - это безопасно, зато функция приведения типа не вызывается.
А с массивом PChar  - действительно, этого не нужно было бы.
Чуть компактнее вариант:

 function IntToBinString(AValue: Integer;
   BitsToShow: Integer = SizeOf(Integer) * 8): string;
 const
   BitsString:  PChar = "0000000100100011010001010110011110001001101010111100110111101111";
 var
   pc: PChar;
 begin
   SetLength(Result, BitsToShow);
   pc := @PChar(Result)[0];
   while BitsToShow >= 4 do begin
     Move(BitsString[(AValue and $F) * 4], pc[BitsToShow - 4], 4 * SizeOf(Char));
     AValue := AValue shr 4;
     Dec(BitsToShow, 4);
   end;
   if BitsToShow > 0 then
     Move(BitsString[(AValue and $F) * 4 + 4 - BitsToShow], pc[0], BitsToShow * SizeOf(Char));
 end;


 
Игорь Шевченко ©   (2013-01-29 18:28) [53]

MBo ©   (29.01.13 18:17) [52]

Я немного не о том:

const
  BitsStrings: array [0 .. $F] of PChar =
    ("0000", "0001", "0010", "0011",
     "0100", "0101", "0110", "0111",
     "1000", "1001", "1010", "1011",
     "1100", "1101", "1110", "1111");


тогда адресную арифметику можно оставить компилятору


 
MBo ©   (2013-01-29 18:36) [54]

>Я немного не о том:
Я понял. Но после исправления на PChar слил всё в в одну строку и проверил производительность  - не изменилась.
По читабельности массив лучше, конечно.


 
MBo ©   (2013-01-29 18:48) [55]

P.S. Ненужной фигнёй заниматься гораздо приятнее, чем нужной фигнёй ;)


 
aka   (2013-01-29 19:10) [56]

Бедная Наташа.


 
Игорь Шевченко ©   (2013-01-29 20:41) [57]

MBo ©   (29.01.13 18:48) [55]


> P.S. Ненужной фигнёй заниматься гораздо приятнее, чем нужной
> фигнёй ;)


Я до сих пор не могу представить приложение, в котором требуется преобразование (быстрое) из двоичного представления в символьное ;)


 
Ega23 ©   (2013-01-29 20:45) [58]


> Я до сих пор не могу представить приложение, в котором требуется
> преобразование (быстрое) из двоичного представления в символьное ;)

Реального - нет. А как задание для семинара на первом-втором курсе - вполне нормально.


 
Jeer ©   (2013-01-29 21:34) [59]


> Реального - нет. А как задание для семинара на первом-втором
> курсе - вполне нормально.


Если нет реальных применений быстрого преобразования, то и задачи такие для студней бессмысленны.
Другое дело, что предложить 7 вариантов функции IntToBin(), отличающихся алгоритмом - это да.


 
Sha ©   (2013-01-29 22:05) [60]

> MBo

Скорее всего, вызов Move будет стоить весьма недешево,
поэтому сначала имеет смысл проверить что-нибудь попроще, например:


procedure IntToBinBufferInternal(pBuffer: PChar; Value, Len: integer);
begin
 repeat;
   dec(Len);
   pBuffer[Len]:=Chr(Value and 1 + 48);
   Value:=Value shr 1;
   until Len<=0;
 end;

function IntToBinStringSha(Value: Integer; Len: integer = SizeOf(integer) * 8): string;
begin
 if Len<=0 then Result:=""
 else begin;
   if Len>32 then Len:=32;
   SetLength(Result, Len);
   IntToBinBufferInternal(pointer(Result), Value, Len);
   end;
 end;


А потом, при желании, можно ускорять таблицами
и двумя (на каждый SizeOfChar) своими заменителями Move.  

P.S.  Болею я. Грипп, наверно.


 
MBo ©   (2013-01-29 22:11) [61]

>поэтому сначала имеет смысл проверить что-нибудь попроще, например:
Я прикидывал вариант без Move, но не довёл до ума. Вряд ли уже руки дойдут...


 
Игорь Шевченко ©   (2013-01-29 22:19) [62]

Sha ©   (29.01.13 22:05) [60]

Саша, а ты как и чем скорость меряешь ? Стандартно по миллиону(арду) циклов и общее время на число циклов или как-то иначе ?


 
Sha ©   (2013-01-29 22:29) [63]

> Игорь Шевченко ©   (29.01.13 22:19) [62]

Да, это самый простой вариант. Его, в основном использую.
Плюс-минус 15 мсек при общем времени выполнения 3-5 сек не играют большой роли. Например, иногда даже на современных процессорах
зависимость времени от положения кода в ОП до десятков процентов доходит.

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


 
DVM ©   (2013-01-29 22:52) [64]

Вызов Move почти ничего не стоит на таких объемах данных.


 
Sha ©   (2013-01-29 23:12) [65]

> DVM ©   (29.01.13 22:52) [64]
> Вызов Move почти ничего не стоит на таких объемах данных.



4 прохода цикла из [60] тоже "почти ничего не стоят", вопрос в том, что будет дешевле?

Какие объемы данных у Натальи, мне не известно.


 
Dennis I. Komarov ©   (2013-02-01 23:33) [66]


> aka   (29.01.13 19:10) [56]
> Бедная Наташа.

Почему бедная?

function DecToBin(AInt: TAnyInt): string;
var
 I: TIntX;
begin
Result:=""; I:= TIntX(AInt);
while I > 0 do begin
  Result:=Result + IntToStr(I and $1);
  I := I shr 1;
end;
if Result = "" then Result :="0";
end;

(без IDE, не проверял)


 
Sha ©   (2013-02-01 23:59) [67]

> без IDE, не проверял

а надо бы


 
Dennis I. Komarov ©   (2013-02-02 16:18) [68]


> а надо бы

Ну да, есть моментик... Но пусть останется, ибо [2]



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

Форум: "Начинающим";
Текущий архив: 2013.10.27;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.62 MB
Время: 0.004 c
2-1359822748
alexdn
2013-02-02 20:32
2013.10.27
Параллельные процессы?


3-1292998110
DelphiN!
2010-12-22 09:08
2013.10.27
Оптимизация SQL запроса


15-1368294835
Дмитрий С
2013-05-11 21:53
2013.10.27
Почему


2-1359921846
Zheksonz
2013-02-04 00:04
2013.10.27
Мистика !))


1-1317311342
nikfel
2011-09-29 19:49
2013.10.27
Как отловить перемещение объекта





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский