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

Вниз

asm вставка ByteToBin и BinToByte   Найти похожие ветки 

 
брюква   (2010-06-20 03:14) [0]

у кого есть такие быстрые вставочки для дельфи,

допустим,

dec 56 = bin 111000, но на вывод надо 00111000  
добивать до 8 бит.


 
KilkennyCat ©   (2010-06-20 03:24) [1]

а по умолчанию байт не добивает?


 
Юрий Зотов ©   (2010-06-20 04:03) [2]

Вряд ли это будет намного медленнее, чем на асме:

function ByteToStr(B: byte): string;
begin
 Result := Format("%d%d%d%d%d%d%d%d",
   [B and 128, B and 64, B and 32, B and 16, B and 8, B and 4, B and 2, B and 1])
end;


 
Юрий Зотов ©   (2010-06-20 04:23) [3]

function StrToByte(S: string): byte;
var
 i: integer;
 Ch: char;
begin
 if (S = "") or (Length(S) > 8)
   raise Exception.Create("Invalid length of string");
 Result := 0;
 for i := Length(S) downto 1 do
 begin
   Ch := S[i];
   if Ch = "1" then
     Result := Result or ((Byte(Ch) - Ord("0")) shl (i -1))
   else
     if Ch <> "0" then
       raise Exception.Create(" Invalid character " + Ch)
 end  
end;


 
Германн ©   (2010-06-20 04:35) [4]


> Юрий Зотов ©   (20.06.10 04:03) [2]
>
> Вряд ли это будет намного медленнее, чем на асме:
>

И с чего бы возникнуть сомнениям?


 
Sha ©   (2010-06-20 10:21) [5]

> И с чего бы возникнуть сомнениям?

С того, что на Паскале, что на ассемблере, быстрее таблицы не придумать :)


 
Jeer ©   (2010-06-20 10:31) [6]

Однако даже не развернутый цикл считает быстрее, чем в [2]

[2] - 12..13 килоциклов

любая из нижеприведенных функций 8..9 килоциклов

function ByteToStr_1(b: byte): string;
var i,t: integer;
begin
 SetLength(Result,8);
 t:=1;
 for i:=8 downto 1 do begin
   if boolean((b and t)) then
     Result[i] := "1"
   else
     Result[i] := "0";
   t := t shl 1;
 end;
end;

function ByteToStr_2(b: byte): string;
var i: integer;
begin
 SetLength(Result,8);
 for i:=8 downto 1 do begin
   if boolean(b mod 2) then
     Result[i] := "1"
   else
     Result[i] := "0";
   b := b shr 1;
 end;
end;


 
Jeer ©   (2010-06-20 10:33) [7]

килоциклов == кило-тиков


 
RWolf ©   (2010-06-20 11:45) [8]

> [6]
тысяч циклов?? столько потеряется разве что на доступе в память мимо кэша, но от этого оптимизация процедуры не спасёт.


 
RWolf ©   (2010-06-20 12:12) [9]

а спасёт — отказ от возврата динамической строки:

type
 TBinString=string[8];

function ByteToStr_3(b: byte): TBinString;
var i: integer;
begin
for i:=8 downto 1 do begin
  if boolean(b mod 2) then
    Result[i] := "1"
  else
    Result[i] := "0";
  b := b shr 1;
end;
end;


на моей машине меньше 400 циклов, согласно показаниям RDTSC.

А вообще, бесполезная это затея — зачем оптимизировать код подготовки human-readable результата? всё равно он затем будет выведен куда-то на монитор, в файл и т.п., на чём в итоге потеряется прорва процессорного времени.


 
RWolf ©   (2010-06-20 12:25) [10]

Ну, и ещё вариант, из любви к искусству:
procedure ByteToStr_6(b: Byte; out res: TBinString);
begin
  if b and $80<>0 then Res[1] := "1" else Res[1] := "0";
  if b and $40<>0 then Res[2] := "1" else Res[2] := "0";
  if b and $20<>0 then Res[3] := "1" else Res[3] := "0";
  if b and $10<>0 then Res[4] := "1" else Res[4] := "0";
  if b and $08<>0 then Res[5] := "1" else Res[5] := "0";
  if b and $04<>0 then Res[6] := "1" else Res[6] := "0";
  if b and $02<>0 then Res[7] := "1" else Res[7] := "0";
  if b and $01<>0 then Res[8] := "1" else Res[8] := "0";
end;


300 циклов.


 
брюква   (2010-06-20 14:01) [11]

Нужны вставочки, я склоняюсь к тому, что работать они будут быстрее..
Выводится никуда ничего не будет, будет перевод в string[8] и обработка этой строки, дальше конвертирование обратно.

И для этого мне нужна макимальная скорость конвертинга.


 
брюква   (2010-06-20 14:08) [12]

RWolf, встречный вопрос, как ты измерял свою процедуру при помощи.
function RDTSC: comp;
var TimeStamp: record case byte of
                 1: (Whole: comp);
                 2: (Lo, Hi: cardinal);
               end;
begin
  asm
    db $0F; db $31;
    mov [TimeStamp.Lo], eax
    mov [TimeStamp.Hi], edx
  end;
  Result := TimeStamp.Whole;
end;
научи.


 
RWolf ©   (2010-06-20 14:19) [13]


> RWolf, встречный вопрос, как ты измерял свою процедуру при
> помощи.

всё проще:
function RDTSC: Int64; assembler;
asm
RDTSC
end;


 
RWolf ©   (2010-06-20 14:20) [14]


> Выводится никуда ничего не будет, будет перевод в string[8]
> и обработка этой строки, дальше конвертирование обратно.
>

Готов поспорить, что для этой обработки конвертация в строку не нужна вовсе.


 
Sha ©   (2010-06-20 14:43) [15]

> брюква   (20.06.10 14:01) [11]
> будет перевод в string[8] и обработка этой строки,
> дальше конвертирование обратно.

Мне тоже интересно, что за обработка такая, для которой нужна конвертация.


 
брюква   (2010-06-20 15:36) [16]

не важно в число или в строку, все равно будет отделение из числа разрядов и работа с ними. Главное надо asm вставочку или максимально быстрый перевод.

На данный момент я так понял перевод RWolf наиболее быстрый. RWolf, а как обратно перевод сделать?


 
брюква   (2010-06-20 15:45) [17]

Основная работа программы будет заключаться в переводе + маленькая модификация. Так что быстрый перевод просто необходим. Перевод будет осуществляться с файлов. Программа считывает кусками в буфер и дальше нужен очень быстры перевод так как файлы могут быть и 1-2 gb.


 
Sha ©   (2010-06-20 16:28) [18]

> брюква   (20.06.10 15:45) [17]
> маленькая модификация

Не хочешь говорить, что за модификация - не надо.
Тебе же хуже.


 
RWolf ©   (2010-06-20 16:35) [19]

[17]
Повторяю, если хочешь скорости — забудь про преобразования в строки и осиль битовые манипуляции. Тогда счёт будет идти не на тысячи циклов, а на десятки, и без всякого асма.


 
брюква   (2010-06-20 19:36) [20]

RWolf, повторяю. не важно в число или в строку, все равно будет отделение из числа разрядов и работа с ними.

вставочек нет?


 
Sha ©   (2010-06-20 19:39) [21]

> брюква   (20.06.10 19:36) [20]
> отделение из числа разрядов и работа с ними

Для этого конвертация туда-сюда не требуется.
Какие вставочки нужны, чтобы это понять?


 
KilkennyCat ©   (2010-06-20 19:41) [22]

в итоге закончится выяснением, что конвертация нужна для корректной работы
for i := 1 to 8 do :)


 
брюква   (2010-06-20 19:51) [23]

Да нет же, мне надо узнать бинарную вариацию. Далее будет отделение поразрядно, заранее отделять нельзя.. нужно узнать бинарный набор.

Все что вы говорите - оффтоп. Процесс продуман, требует лишь замены этой функции, так как она грузит процесс.


 
KilkennyCat ©   (2010-06-20 19:58) [24]

все равно непонятно. добить лишние нули имеет смысл только в визуализации, в противном случае - они уже добиты, аутоматически, так сказать :)


 
Sha ©   (2010-06-20 20:13) [25]

> брюква   (20.06.10 19:51) [23]
> Процесс продуман,

Если продуман, расскажи что делать с данными собираешься между конвертациями туда-сюда.
Развей наши сомнения.

> требует лишь замены этой функции, так как она грузит процесс.

Ну, так тебе предлагают заменить ее на пустое место.
Оно ваще ничего не грузит.

> Все что вы говорите - оффтоп

Пока что такое чувство, что оффтоп как раз конвертация.


 
Amoeba_   (2010-06-20 22:33) [26]


> Процесс продуман

http://www.gunsmoker.ru/2008/10/x-y-z.html


 
Юрий Зотов ©   (2010-06-21 00:23) [27]

> брюква  

Двоичные числа 00100100 и 100100 - это одно и то же. Добавление ведущих нулей имет смысл только при преобразовании в строку для показа человеку.

А Вы говорите, что показывать ничего не собираетесь. Поэтому Вас просто не понимают - зачем тогда нужна какая-то там конвертация?


 
Германн ©   (2010-06-21 01:34) [28]


> А Вы говорите, что показывать ничего не собираетесь. Поэтому
> Вас просто не понимают - зачем тогда нужна какая-то там
> конвертация?

См. [26]

Похоже автор придумал для своей "конвертации" алгоритм, который не может обойтись без преобразования байта в строку из восьми символов.
Ему бы в лицей пойти http://www.delphikingdom.com/asp/viewitem.asp?catalogid=838


 
брюква   (2010-06-21 02:21) [29]

Юрий Зотов, вы что мне простые истины говорите... само собой, но надо 8 бит. Работа будет с этими 8ми битами, так что нужны эти самые 2 нулевых разряда какбэ.

Германн, вопрос не на смех, пройди в другую тему. да

--
троллинг не по сабжу, ребят.


 
брюква   (2010-06-21 02:23) [30]

Германн, я тут давно, от тебя ответы такого типа в темах http://www.youtube.com/watch?v=YamUFw-JsEA  случайно не ты ли это. жжош

см.  [29]


 
Германн ©   (2010-06-21 02:40) [31]


> Германн, вопрос не на смех, пройди в другую тему. да
>

Ты по ссылке в [26] прочитал?
Ты по ссылке в [28] прочитал?

То что ты тут давно, ничего не значит.

"вы что мне простые истины говорите... само собой, но надо 8 бит. Работа будет с этими 8ми битами, так что нужны эти самые 2 нулевых разряда "
Вот эти слова означают, что нужно читать учебники. Или идти в лицей, ссылку на который я дал в [28]. Бо в байте памяти не может быть не 8 бит!

LMD!


 
KilkennyCat ©   (2010-06-21 04:04) [32]


> Бо в байте памяти не может быть не 8 бит!

я бы не стал так категорично... Скажем так, в большинстве известных и наиболееупотребительных случаях в байте 8 бит.


 
Alx2 ©   (2010-06-21 08:05) [33]

>брюква

Гонять в строку, а потом из строки - в куче случаев ничем неоправданная расточительность. С битами можно работать без промежуточной конвертации, сразу рассматривая число как массив бит. Здесь уже писали об этом.

Итак, для чего нужна строка? Признавайся! :)


 
Sha ©   (2010-06-21 09:06) [34]

> брюква   (21.06.10 02:21) [29]

Приводи свой код.
Если его там немного, перепишу без конвертации.
Гарантирую увеличение скорости в 5 раз.


 
Jeer ©   (2010-06-21 09:32) [35]


> RWolf ©   (20.06.10 12:12) [9]
>
> а спасёт — отказ от возврата динамической строки:


И не спорю :)

Примеры привел чисто школьные, чтобы автор топика начал думать.
Варит от ЮЗ, конечно красив, но оптимизации уже не подлежит.

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


 
картман ©   (2010-06-21 09:49) [36]


> Sha ©   (21.06.10 09:06) [34]
>
> > брюква   (21.06.10 02:21) [29]
>
> Приводи свой код.
> Если его там немного, перепишу без конвертации.
> Гарантирую увеличение скорости в 5 раз.

а что, отличная идея: вынести всем мозг бредовой идеей, пока на помощь не подпишутся))


 
[true]TRIx ©   (2010-06-21 14:30) [37]

вопрос всеж один. asm вставка ByteToBin и BinToByte или приведите самый удачный код в плане скорости перевода. Как в Bin так и обратно. Полемика не требуется.


 
Плохиш ©   (2010-06-21 14:39) [38]

[true]TRIx © = брюква?


 
[true]TRIx ©   (2010-06-21 14:45) [39]

Плохиш, действительно, просвети нас своим вариантом по вопросу.


 
Amoeba_   (2010-06-21 14:54) [40]


> [true]TRIx ©   (21.06.10 14:30) [37]
>
> вопрос всеж один. asm вставка ByteToBin и BinToByte или
> приведите самый удачный код в плане скорости перевода. Как
> в Bin так и обратно. Полемика не требуется.

Впрямь "Сага о Х, Y и Z..."
http://www.gunsmoker.ru/2008/10/x-y-z.html



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

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

Наверх





Память: 0.55 MB
Время: 0.006 c
15-1277105792
12
2010-06-21 11:36
2010.09.19
Идея такая. Пусть пользователь сам себе рисует форму..


11-1222555772
AnarchyMob
2008-09-28 02:49
2010.09.19
Lazarus и KOL &amp; MCK


2-1277491678
New555
2010-06-25 22:47
2010.09.19
if Key = VK_F1 then


11-1222560137
AnarchyMob
2008-09-28 04:02
2010.09.19
bsClear в WinCE


2-1276601299
DevilDevil
2010-06-15 15:28
2010.09.19
Текст в Clipboard. CF_TEXT или CF_UNICODETEXT





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