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

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.58 MB
Время: 0.004 c
15-1368449808
sniknik
2013-05-13 16:56
2013.10.27
Ищу книгу (/автора)...


15-1368014800
Jeer
2013-05-08 16:06
2013.10.27
С Праздником Победы!


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


15-1368710507
О-Сознание
2013-05-16 17:21
2013.10.27
Сделать в один WHILE.


2-1360060314
Чайник
2013-02-05 14:31
2013.10.27
Как поместить картинки в ComboBoxEx





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