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

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.6 MB
Время: 0.011 c
15-1368014800
Jeer
2013-05-08 16:06
2013.10.27
С Праздником Победы!


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


2-1359654647
berrimor
2013-01-31 21:50
2013.10.27
координаты второго монитора


1-1316775192
denkop
2011-09-23 14:53
2013.10.27
Помогите с отрисовкой текста на TImage


2-1360056754
vlad
2013-02-05 13:32
2013.10.27
TList