Russian Qt Forum
Ноябрь 23, 2024, 04:26 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: int и float ->BIN быстрый перевод  (Прочитано 11953 раз)
Bjedug
Гость
« : Февраль 14, 2007, 18:03 »

Доброго вам времени суток!!!
Есть такой вопрос!!!
Как перевести быстро числа типа float и int в двоичный код без деления.
З.Ы. Все таки они както хронятся в компьютере
Записан
alex12
Гость
« Ответ #1 : Февраль 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);

Записан
Вудруф
Гость
« Ответ #2 : Февраль 15, 2007, 08:39 »

float в двоичном виде выводить смысла не имеет. Там часть отдаётся мантиссе, часть - порядку. Таким образом вывод "единичек" не информативен.
Для int можно воспользоваться std::bitset.
Записан
Bjedug
Гость
« Ответ #3 : Февраль 15, 2007, 09:47 »

вобщем задача такая:
Есть числа [0.0, 1.0] типа float. Нужно создать класс  BIN - двоичное число и перегрузить операции сложения и умножения, просто каждый раз переводить Bin->Dec или Dec->Bin много времени займет
Записан
alex12
Гость
« Ответ #4 : Февраль 15, 2007, 11:35 »

Тогда я совсем не понял задачу: ЗАЧЕМ класс BIN если можно просто так складывать и умножать? Это какие-то нестандартные операции сложения/умножения?
Записан
Bjedug
Гость
« Ответ #5 : Февраль 15, 2007, 12:06 »

Вот задача ... Есть нейронная сеть которая обучается генетическим алгоритмом. Веса нейронной сети кодируются типом float (вещественное кодирование). Хочу переписать класс "Нейронная сеть"
 как класс-шаблон, т.е. хочу использовать float - использую float, хочу  двоичную кодироку использую каласс Bin. Пучему перегружаю сложение и умножение, так в нейросетях другого и ненужно.
Почему двоичное кодирование - хочу поюзать генетический алгоритм с двоичным кодированием... если подсобите с кодом Грея (быстрый перевод) то буду только рад
Записан
alex12
Гость
« Ответ #6 : Февраль 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 бит вполне пойдет.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.045 секунд. Запросов: 21.