Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вывести integer в виде массива бит 
:(
    Опции темы
MetalFan
Дата 6.4.2009, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



Цитата(mopsa @  6.4.2009,  16:44 Найти цитируемый пост)
но это будет 32
но метод MetalFan`a после небольшой поправки мне кажется лучьшим 

а, ну таки тогда две ошибки было) плохо арифметику в школе учил, поэтому вышло 8*4=36)

Это сообщение отредактировал(а) MetalFan - 6.4.2009, 16:49


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
CodeMonkey
Дата 6.4.2009, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



Вот ещё до кучи вариант моего варианта - стал пострашнее, но зато работает в два раза быстрее MetalFan-ского. Правда, если заменить копирование в Dst на Move (для варианта со String в D2009), то прирост скорости будет всего около 25-ти процентов. 

Код
// ANSI:
function RawToBitStr(const Data; const Size: Integer): AnsiString;
const
  C: array[0..15] of AnsiString = ('0000', '0001', '0010', '0011',
                                   '0100', '0101', '0110', '0111',
                                   '1000', '1001', '1010', '1011',
                                   '1100', '1101', '1110', '1111');
var
  X: Integer;
  Src: PByte;
  Dst: PInteger;
begin
  SetLength(Result, Size * 8);

  Src := Pointer(Integer(@Data) + Size - 1);
  Dst := Pointer(Result);

  for X := 0 to Size - 1 do
  begin
    Dst^ := PInteger(C[Src^ shr 4])^;
    Inc(Dst);
    Dst^ := PInteger(C[Src^ and $F])^;
    Inc(Dst);
    Dec(Src);
  end;
end;

// Универсальный:
function RawToBitStr(const Data; const Size: Integer): String;
const
  C: array[0..15] of String = ('0000', '0001', '0010', '0011',
                               '0100', '0101', '0110', '0111',
                               '1000', '1001', '1010', '1011',
                               '1100', '1101', '1110', '1111');
var
  X: Integer;
  Src: PByte;
  Dst: PChar;
begin
  SetLength(Result, Size * 8);

  Src := Pointer(Integer(@Data) + Size - 1);
  Dst := Pointer(Result);

  for X := 0 to Size - 1 do
  begin
    Move(PInteger(C[Src^ shr 4])^, Dst^, 4 * SizeOf(Char));
    Inc(Dst, 4);
    Move(PInteger(C[Src^ and $F])^, Dst^, 4 * SizeOf(Char));
    Inc(Dst, 4);
    Dec(Src);
  end;
end;

function IntToBitStr(const I: Integer): AnsiString; inline;
begin
  Result := RawToBitStr(I, SizeOf(I));
end;


А реализация через CvtInt работает в 2.5 раза медленнее MetalFan-ской - но зато она проще всего в реализации (всего-то и надо, как цифирьку 16 в IntToHex поменять на 2-ку).


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
MetalFan
Дата 6.4.2009, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



Цитата(CodeMonkey @  6.4.2009,  17:50 Найти цитируемый пост)
зато работает в два раза быстрее MetalFan-ского

ну конееечно! хитрый! сразу 4 символа в один заход пишешь...  а если таблицу расширить до полного байта, то еще быстрее дело пойдет ;)
зы. зато мой вариант нагляднее и понятнее) и преподу его проще объяснить ;) имхо


Это сообщение отредактировал(а) MetalFan - 6.4.2009, 18:22


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
CodeMonkey
Дата 6.4.2009, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



Цитата(MetalFan @  6.4.2009,  18:17 Найти цитируемый пост)
а если таблицу расширить до полного байта, то еще быстрее дело пойдет ;)

Ага smile) Только таблицу на полный байт замучаешся писать. Да, твой вариант простейший в реализации.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
MetalFan
Дата 6.4.2009, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



Цитата(CodeMonkey @  6.4.2009,  19:48 Найти цитируемый пост)
Только таблицу на полный байт замучаешся писать.

а ее можно при запуске приложения генерировать)


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Beltar
Дата 7.4.2009, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 3
Всего: 7



Код

Mask:=1;
for i:=0 to SizeOf(IntegerVariable) do
  begin
  if (IntegerVariable and Mask)>0 
    then Вывести 1
    else Вывести 0
  Mask:=Mask shl 1;  
  end;


Или я не прав? smile


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
mes
Дата 7.4.2009, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 1
Всего: 250



Цитата(Beltar @  7.4.2009,  09:36 Найти цитируемый пост)
Или я не прав? smile 

Цитата(Beltar @  7.4.2009,  09:36 Найти цитируемый пост)
SizeOf(IntegerVariable)

SizeOf() возвращает кол-во байт, а не бит  smile 

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

Добавлено через 3 минуты и 32 секунды
Цитата(MetalFan @  6.4.2009,  17:17 Найти цитируемый пост)
а если таблицу расширить до полного байта, то еще быстрее дело пойдет ;)

только тогда PInteger не подойдет  smile , так как для 8 анси-символов занимают 64 бита.



--------------------
PM MAIL WWW   Вверх
CodeMonkey
Дата 7.4.2009, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



Цитата(mes @  7.4.2009,  12:59 Найти цитируемый пост)
только тогда PInteger не подойдет   , так как для 8 анси-символов занимают 64 бита.

Ну можно ведь и Move использовать. ... и даже вырвать оттуда кусок для копирования 8-16 байт (16-ть - для unicode), чтоб не вызывать функцию в цикле. Но под таблицу надо будет несколько Кб.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
mes
Дата 7.4.2009, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 1
Всего: 250



Цитата(CodeMonkey @  7.4.2009,  12:06 Найти цитируемый пост)
Ну можно ведь и 

можно, но имхо овчинка выделки не стоит, чтоб идти дальше таблицы из 4х байт


--------------------
PM MAIL WWW   Вверх
bems
Дата 7.4.2009, 14:44 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Цитата(mes @  6.4.2009,  15:56 Найти цитируемый пост)
но откуда взялось 36 ?! 

предлагаю SetLength(Result, 42 );


--------------------
Обижено школьников: 8
PM MAIL   Вверх
MetalFan
Дата 7.4.2009, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



[off]
Цитата(bems @  7.4.2009,  14:44 Найти цитируемый пост)

предлагаю SetLength(Result, 42 ); 

а поччему не 24? ))) может тогда лучше 44? типа как в анекдоте)[/off]


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
bems
Дата 7.4.2009, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



MetalFan, потому что 42

Это сообщение отредактировал(а) bems - 7.4.2009, 17:18


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0693 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.