С плавающей запятой к двоичному значению (C ++)

Я мог бы «автоматизировать» его с помощью вызова:

def __fix_io_encoding(last_resort_default='UTF-8'):
  import sys
  if [x for x in (sys.stdin,sys.stdout,sys.stderr) if x.encoding is None] :
      import os
      defEnc = None
      if defEnc is None :
        try:
          import locale
          defEnc = locale.getpreferredencoding()
        except: pass
      if defEnc is None :
        try: defEnc = sys.getfilesystemencoding()
        except: pass
      if defEnc is None :
        try: defEnc = sys.stdin.encoding
        except: pass
      if defEnc is None :
        defEnc = last_resort_default
      os.environ['PYTHONIOENCODING'] = os.environ.get("PYTHONIOENCODING",defEnc)
      os.execvpe(sys.argv[0],sys.argv,os.environ)
__fix_io_encoding() ; del __fix_io_encoding

Да, здесь можно получить бесконечный цикл, если этот «setenv» терпит неудачу.

15
задан user58389 23 January 2009 в 20:55
поделиться

9 ответов

Используйте объединение и bitset:

#include <iostream>
#include <bitset>

int main()
{
    union
    {
         float input;   // assumes sizeof(float) == sizeof(int)
         int   output;
    }    data;

    data.input = 2.25125;

    std::bitset<sizeof(float) * CHAR_BIT>   bits(data.output);


    std::cout << bits << std::endl;

    // or

    std::cout << "BIT 4: " << bits[4] << std::endl;
    std::cout << "BIT 7: " << bits[7] << std::endl;
}

Это не может быть массив, но можно получить доступ к битам с [] оператор, как будто Вы использовали массив.

Вывод

$ ./bits
01000000000100000001010001111011
BIT 4: 1
BIT 7: 0
22
ответ дан Martin York 24 January 2009 в 06:55
поделиться
  • 1
    Спасибо! я знал об использовании, но мне wouldn' t думали о сохранении состояния в переменной. По моему скромному мнению, I' d ожидают использование () метод на дб для жидкого использования, например, db.use (' sourceDb') .collectionA.do (db.use (' destDb'). – b7kich 15 January 2011 в 04:55
int fl = *(int*)&floatVar; //assuming sizeof(int) = sizeof(float)

int binaryRepresentation[sizeof(float) * 8];

for (int i = 0; i < sizeof(float) * 8; ++i)
    binaryRepresentation[i] = ((1 << i) & fl) != 0 ? 1 : 0;

Объяснение

(1 << i) сдвиги значение 1, i биты налево. & оператор вычисляет поразрядный и из операндов.

for цикл работает однажды за каждым из 32 битов в плавании. Каждый раз, i будет числом бита, из которого мы хотим извлечь значение. Мы вычисляем поразрядное и числа и 1 << i:

Предполагают, что число: 1001011, и i = 2

1<<i будет равно 0000100

  10001011
& 00000100
==========
  00000000

если i = 3 затем:

  10001011
& 00001000
==========
  00001000

В основном, результатом будет число с [1 113] th набор битов к i, th бит исходного числа и все другие биты являются нулем. Результатом будет или нуль, что означает i, бит th в исходном числе был нулем или ненулевой, что означает, что фактическое число имело i, th укусил равный [1 117].

14
ответ дан Mehrdad Afshari 24 January 2009 в 06:55
поделиться
  • 1
    Это может произойти, что база данных имеет символы UTF-8. Поскольку это пробегает клиент, если клиент является собственным (например, для Ubuntu, $ mongo --version = > MongoDB shell version: 1.6.3) это может испытать недостаток в UTF-8, и затем копия перестанет работать. Если это верно, и Вы don' t хотят поместить грязный в Ваш сервер для перекомпиляции нового клиента, можно всегда перекомпилировать в отдельную машину и делать это задание по сети, соединяющейся с удаленным сервером. Тем не менее, данные будут вытекать из сервера клиенту и назад, таким образом, это сможет быть медленно. Так или иначе с удаленным клиентом UTF-8, работами!!! – Xavi Montero 20 May 2012 в 06:22

Можно использовать неподписанный символ для чтения байта плавающего байтом в целочисленный массив:

unsigned int bits[sizeof (float) * CHAR_BIT];
unsigned char const *c = static_cast<unsigned char const*>(
    static_cast<void const*>(&my_float)
);

for(size_t i = 0; i < sizeof(float) * CHAR_BIT; i++) {
    int bitnr = i % CHAR_BIT;
    bits[i] = (*c >> bitnr) & 1;
    if(bitnr == CHAR_BIT-1)
        c++;
}

// the bits are now stored in "bits". one bit in one integer.

Между прочим, если Вы просто хотите сравнить биты (поскольку Вы комментируете другой ответ), использование memcmp:

memcmp(&float1, &float2, sizeof (float));
2
ответ дан Johannes Schaub - litb 24 January 2009 в 06:55
поделиться
  • 1
    Просто необходимо не упустить условия, которые никогда не могут приводить к истинному оператору или you' ll заканчиваются в черной дыре. Я извлек тот урок, когда я писал ассемблер и C, и запер мою машину настолько плохо, я должен был вытянуть шнур питания, чтобы заставить его возвращаться к моему управлению. Несколько раз. Вздох.:-) – the Tin Man 12 February 2011 в 12:01

При необходимости в особом представлении с плавающей точкой необходимо будет создать это семантически от самого плавания, не копированием бита.

c0x стандарт: http://c0x.coding-guidelines.com/5.2.4.2.2.html не определяет формат чисел с плавающей точкой.

2
ответ дан Douglas Leeder 24 January 2009 в 06:55
поделиться

Рассмотрение комментариев в этом ответе ( Плавающая точка к Двоичному значению (C++) ) причина сделать это должно выполнить поразрядное сравнение двух значений.

#include <iostream>

int main()
{
    union Flip
    {
         float input;   // assumes sizeof(float) == sizeof(int)
         int   output;
    };

    Flip    data1;
    Flip    data2;
    Flip    data3;

    data1.input = 2.25125;
    data2.input = 2.25126;
    data3.input = 2.25125;

    bool    test12  = data1.output ^ data2.output;
    bool    test13  = data1.output ^ data3.output;
    bool    test23  = data2.output ^ data3.output;

    std::cout << "T1(" << test12 << ") T2(" << test13 << ") T3(" << test23 << ")\n";


}
2
ответ дан Community 24 January 2009 в 06:55
поделиться
  • 1
    Вы имели в виду unless или until? (They' ре и отрицательные стороны, и они оба начинают с " un") – Andrew Grimm 14 February 2011 в 10:07

можно ли просто считать двоичный файл в памяти что переменная плавающая?

Да. Статический состав исполнителей указатель на него к международному указателю и считал биты из результата. Тип IEEE 754 float в C++ составляет 32 бита.

2
ответ дан codekaizen 24 January 2009 в 06:55
поделиться

Бросьте международный указатель на указатель плавающий, и Вы сделаны.

(Хотя я не объявил бы это как международный массив. Я использовал бы пусто* для прояснения, память используется в качестве места свалки для других значений.)

Кстати, почему Вы только не используете массив плаваний?

1
ответ дан benjismith 24 January 2009 в 06:55
поделиться
  • 1
    В Вашем коде Вы имеете if (true) - поэтому, когда JSON когда-нибудь возвращен? – Paul 28 April 2011 в 12:05

Создайте объединение плавания и и неподписанный долго. установите значение участника плавающего и выполните итерации по битам неподписанного длинного значения, как уже описано в других ответах.

Это устранит операторы броска.

1
ответ дан Noel Walters 24 January 2009 в 06:55
поделиться
  • 1
    Я просто тестировал там. Я протестировал бы на ошибку в эхо-сигнале, тогда возвращают json, иначе возвращают HTML. – Mike Flynn 30 April 2011 в 08:58

Самый простой способ:

float myfloat;
file.read((char*)(&myfloat),sizeof(float));
-1
ответ дан 1 December 2019 в 00:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: