Это очень зависит от архитектуры. После сбора следующей информации
- Endianess вашей целевой архитектуры
- представление с плавающей точкой (например IEEE754)
- Размера вашего
double
типа
вы должны быть в состоянии получить которое вы ищете. Пример испытания на системе x86_64
#include <iostream>
#include <climits>
int main()
{
double v = 72.4;
// Boilerplate to circumvent the fact bitwise operators can't be applied to double
union {
double value;
char array[sizeof(double)];
};
value = v;
for (int i = 0; i < sizeof(double) * CHAR_BIT; ++i) {
int relativeToByte = i % CHAR_BIT;
bool isBitSet = (array[sizeof(double) - 1 - i/CHAR_BIT] &
(1 << (CHAR_BIT - relativeToByte - 1))) == (1 << (CHAR_BIT - relativeToByte - 1));
std::cout << (isBitSet ? "1" : "0");
}
return 0;
}
Live Example
Выход
0100000001010010000110011001100110011001100110011001100110011010
, который разделен на sign
, exponent
и significand
(или мантиссы), является
0 10000000101 (1.)0010000110011001100110011001100110011001100110011010
(Изображение взято из wikipedia)
В любом случае вы должны знать, как работает ваша цель представление, в противном случае эти цифры будут в значительной степени бесполезны для вас.
Поскольку ваш вопрос неясно, хотите ли вы, чтобы эти целые числа находились в том порядке, который имеет смысл в отношении внутреннего представления вашего числа, просто выгружайте байты по этому адресу, когда вы их встретите, я добавляю другое простой метод просто дамп каждый байт по этому адресу (и показывающий другой способ работы с битовыми операторами и double
)
double v = 72.4;
uint8_t *array = reinterpret_cast<uint8_t*>(&v);
for (int i = 0; i < sizeof(double); ++i) {
uint8_t byte = array[i];
for (int bit = CHAR_BIT - 1; bit >= 0; --bit) // Print each byte
std::cout << ((byte & (1 << bit)) == (1 << bit));
}
Приведенный выше код будет просто печатать каждый байт из одного в нижнем обращении к одному с высшим адрес.
Edit: так как кажется, что вы просто заинтересованы в том, сколько 1s и 0s есть (т.е. порядок полностью не имеет значения), в данном конкретном случае я согласен с другими ответами, и я бы тоже просто перейдите к счетному решению
uint8_t *array = reinterpret_cast<uint8_t*>(&v);
for (int i = 0; i < sizeof(double); ++i) {
uint8_t byte = array[i];
for (int j = 0; j < CHAR_BIT; ++j) {
std::cout << (byte & 0x1);
byte >>= 1;
}
}
Это будет печатать байты от наиболее значимого до наименьшего по одному от наименее значимого бита до максимального. Я не уверен, что этот порядок имеет смысл. –
Какой заказ _does_ имеет смысл? Существует причина, по которой существуют проблемы с контентом. Весь выбор представления довольно произволен. Здесь речь идет о _accessing_ бит, и, хотя я думаю, что другие приказы будут более удачными, на самом деле это зависит от OP, чтобы решить эти последующие варианты. – sehe
Да, и я считаю, что это следует упомянуть, поскольку OP может не обращать внимания на эту концепцию. –