Russian Qt Forum

Программирование => С/C++ => Тема начата: Bjedug от Февраль 14, 2007, 18:03



Название: int и float ->BIN быстрый перевод
Отправлено: Bjedug от Февраль 14, 2007, 18:03
Доброго вам времени суток!!!
Есть такой вопрос!!!
Как перевести быстро числа типа float и int в двоичный код без деления.
З.Ы. Все таки они както хронятся в компьютере


Название: int и float ->BIN быстрый перевод
Отправлено: alex12 от Февраль 14, 2007, 22:56
Вопрос: а что нужно на выходе: char[32]?
Если да, то например:
Код:

char* int2char(int a)
{
  static char str[33];
  int i=32;
  char *p;
  str[32]=0;
  memset(str,'0',32);
  p = &str[31];
  while(i)
  { if( a & 1 ) *p='1';
    a >>= 1;
    p--;
    i--;
  }
  return str;
}


Вроде не ошибся...

Еще более быстрый вариант -- табличный способ. Сделать таблицу для 1 байта, и int делать в 4 итерации.

Код:

char* int2char(int a)
{
  static char str[33];
  const char table[9][256] =
      { "00000000","00000001","00000010", "00000011",
         "00000100","00000101","00000110", ... "11111111" };

  str[32]=0;
  memcpy( &str[24], &table[0][ a & 0xFF ], 8 );
  a >>= 8;
  memcpy( &str[16], &table[0][ a & 0xFF ], 8 );
  a >>= 8;
  memcpy( &str[8], &table[0][ a & 0xFF ] , 8);
  a >>= 8;
  memcpy( &str[24], &table[0][ a ], 8 );

  return str;
}


Здесь правда memcpy наверное все время сожрет. Так что еще не понятно какой способ быстрее.

Таблицу набивать, естественно, не руками, а специальной утилиткой, использующей первый метод.

По поводу float, думаю, тут нужно что-то типа:
Код:


  float f;
  int i;

  i = *((int*)(&f));
  int2char(i);



Название: int и float ->BIN быстрый перевод
Отправлено: Вудруф от Февраль 15, 2007, 08:39
float в двоичном виде выводить смысла не имеет. Там часть отдаётся мантиссе, часть - порядку. Таким образом вывод "единичек" не информативен.
Для int можно воспользоваться std::bitset.


Название: int и float ->BIN быстрый перевод
Отправлено: Bjedug от Февраль 15, 2007, 09:47
вобщем задача такая:
Есть числа [0.0, 1.0] типа float. Нужно создать класс  BIN - двоичное число и перегрузить операции сложения и умножения, просто каждый раз переводить Bin->Dec или Dec->Bin много времени займет


Название: int и float ->BIN быстрый перевод
Отправлено: alex12 от Февраль 15, 2007, 11:35
Тогда я совсем не понял задачу: ЗАЧЕМ класс BIN если можно просто так складывать и умножать? Это какие-то нестандартные операции сложения/умножения?


Название: int и float ->BIN быстрый перевод
Отправлено: Bjedug от Февраль 15, 2007, 12:06
Вот задача ... Есть нейронная сеть которая обучается генетическим алгоритмом. Веса нейронной сети кодируются типом float (вещественное кодирование). Хочу переписать класс "Нейронная сеть"
 как класс-шаблон, т.е. хочу использовать float - использую float, хочу  двоичную кодироку использую каласс Bin. Пучему перегружаю сложение и умножение, так в нейросетях другого и ненужно.
Почему двоичное кодирование - хочу поюзать генетический алгоритм с двоичным кодированием... если подсобите с кодом Грея (быстрый перевод) то буду только рад


Название: int и float ->BIN быстрый перевод
Отправлено: alex12 от Февраль 16, 2007, 00:39
В нейронных сетях я совсем не мастер...

Про код Грея хороршо знает Wikipedia:

Алгоритм преобразования из двоичной системы счисления в код Грея, записанный на языке C:
Код:

unsigned int grayencode(unsigned int g)
{
   return g ^ (g >> 1);
}

обратный алгоритм (преобразование из кода Грея в двоичную систему счисления):
Код:

unsigned int graydecode(unsigned int gray)
{
   unsigned int bin;
   for (bin = 0; gray; gray >>= 1)
   { bin ^= gray;
   }
   return bin;
}


Прямой алгоритм очень быстрый, а обратный можно сделать таблицей. Думаю даже 128K для 16 бит вполне пойдет.