1

Тема: Перетворення float в binary

Потрібно було перетворити float в бінарну форму, а тоді бінарну форму в ціле число.
Я знайшов рішення:

#include <bitset>
#include <climits>

int convert_to_int(float f) {
  union
    {
         float input;
         int   output;
    }    data;

    data.input = f;

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

Не розумію лише як працює в union input та output.
Тобто bitset приймає або ціле число, або string.
Тому зрозуміло, чому в bits береться саме int.
Але як конвертація float в int в union відбувається незрозуміло.

2

Re: Перетворення float в binary

Ваш код - UB, ще й із зайвою операцією. Нащо вам тут bitset узагалі? Числа в C++ і так бінарні.
Безпечне перетворення має виглядати так:

return reinterpret_cast<int&>(f);

Оскільки int та float на вашій архітектурі мають однаковий розмір і вирівнювання, і оптимізатор не втрутився, ви маєте union з 4 байтів. Коли ви пишете в input, щось розміщується в цих 4 байтах (число з рухомою комою одинарної точності у форматі IEEE 754). Коли ви читаєте з output, щось читається з цих 4 байтів. Ви читаєте ці байти як int у bitset, а потім витягаєте значення bitset як unsigned long і перетворюєте його назад на int, абсолютно безглуздо. Якби не пощастило — то читали б сміття (а оптимізатор може з чистою совістю викинути значення узагалі, стандарт це дозволяє).

Подякували: Teg Miles, lucas-kane, leofun013

3

Re: Перетворення float в binary

koala написав:

Безпечне перетворення має виглядати так:

Гм, поєднання reinterpret_cast та слова "безпечно" таке собі :)
Компілятори, які слідують strict-aliasing семантиці, не дадуть гарантій, що це спрацює. В даному випадку, це ніяк не краще за варіант з union. Більш безпечним буде використання std::bit_cast.

constexpr double f64v = 19880124.0; 
constexpr auto   u64v = std::bit_cast<std::uint64_t>(f64v);
static_assert(std::bit_cast<double>(u64v) == f64v); // round-trip
Подякували: koala, Teg Miles, lucas-kane, leofun014

4

Re: Перетворення float в binary

А як краще перетворювати ціле число в бінарне?
Ось два методи, які я знайшов:

    std::bitset<8> a_bits(a);
    std::bitset<sizeof(long) * CHAR_BIT> b_bits(b);

Не розумію яка користь з другого. Там початкових нулів забагато.

5

Re: Перетворення float в binary

Не розумію питання, що означає:

Як краще перетворювати ціле число в бінарне

?
Якщо мова про цілі числа типів int, short, char тощо, то вони і так є бінарними..
Ви б краще пояснили, що ви хочете зробити.

Подякували: leofun011

6

Re: Перетворення float в binary

wander написав:

Не розумію питання, що означає:

Як краще перетворювати ціле число в бінарне

?
Якщо мова про цілі числа типів int, short, char тощо, то вони і так є бінарними..
Ви б краще пояснили, що ви хочете зробити.

Я мав на увазі бінарний запис одиницями та нулями.

7

Re: Перетворення float в binary

Teg Miles написав:

Я мав на увазі бінарний запис одиницями та нулями.

Вони записані в пам'яті одиницями і нулями, тому ваше "пояснення" не допомагає. Вам потрібен зручний доступ до конкретних бітів, і ви вважаєте, що b[idx] принципово зручніше за (b>>idx)&1? Чи щось інше? От які саме дії з бінарними числами вам потрібні? Бо наразі єдина дія, яку ви виконуєте - це перетворення "бінарного" bitset на число. А це з числами значно простіше робити :)

8

Re: Перетворення float в binary

koala написав:
Teg Miles написав:

Я мав на увазі бінарний запис одиницями та нулями.

Вони записані в пам'яті одиницями і нулями, тому ваше "пояснення" не допомагає. Вам потрібен зручний доступ до конкретних бітів, і ви вважаєте, що b[idx] принципово зручніше за (b>>idx)&1? Чи щось інше? От які саме дії з бінарними числами вам потрібні? Бо наразі єдина дія, яку ви виконуєте - це перетворення "бінарного" bitset на число. А це з числами значно простіше робити :)

Мені потрібно порівнювати одиниці й нулі на певних місцях та змінювати їхнє значення на обернене (1 на 0 чи 0 на 1).

9

Re: Перетворення float в binary

Штудіюйте bitwise operators та маніпуляції з ними. Інформації по цьому в інтернетах повно.

Подякували: koala, Teg Miles, leofun013

10

Re: Перетворення float в binary

Та просто "побітові операції" шукайте, українською купа інформації.