Я мог бы «автоматизировать» его с помощью вызова:
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» терпит неудачу.
Используйте объединение и 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
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].
$ 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));
При необходимости в особом представлении с плавающей точкой необходимо будет создать это семантически от самого плавания, не копированием бита.
c0x стандарт: http://c0x.coding-guidelines.com/5.2.4.2.2.html не определяет формат чисел с плавающей точкой.
Рассмотрение комментариев в этом ответе ( Плавающая точка к Двоичному значению (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";
}
unless
или until
? (They' ре и отрицательные стороны, и они оба начинают с " un")
– Andrew Grimm
14 February 2011 в 10:07
можно ли просто считать двоичный файл в памяти что переменная плавающая?
Да. Статический состав исполнителей указатель на него к международному указателю и считал биты из результата. Тип IEEE 754 float
в C++ составляет 32 бита.
Бросьте международный указатель на указатель плавающий, и Вы сделаны.
(Хотя я не объявил бы это как международный массив. Я использовал бы пусто* для прояснения, память используется в качестве места свалки для других значений.)
Кстати, почему Вы только не используете массив плаваний?
if (true)
- поэтому, когда JSON когда-нибудь возвращен?
– Paul
28 April 2011 в 12:05
Создайте объединение плавания и и неподписанный долго. установите значение участника плавающего и выполните итерации по битам неподписанного длинного значения, как уже описано в других ответах.
Это устранит операторы броска.
Самый простой способ:
float myfloat;
file.read((char*)(&myfloat),sizeof(float));