Ввод типов данных unsigned char и float, показать их внутреннее представление в двоичной системе счисления

Разработать алгоритм ввода с клавиатуры типов данных unsigned char и float и показать на экране их внутреннее представление в двоичной системе счисления. Также нужно установить в заданное пользователем состояние определённое количество рядом стоящих бит, номер старшего бита, как и всё остальное, вводится с клавиатуры.

float x = 3.14;

    for (int i = sizeof(x) - 1; i >= 0; i--)
        cout << bitset<8>(reinterpret_cast<char*>(&x)[i]);
    cout << endl;

    unsigned char c = 2;
    for (int i = 7; i >= 0; --i) cout << ((c >> i) & 1);
}

Вышло что-то такое, а как сделать остальную часть без понятия…

Наверно надо в самом начале всё перевести в массив битов или bitset (один на всё число), вывести биты, поменять какие-то биты, потом обратно превратить биты в число и вывести число.

bitset сам не умеет это, так что надо как-то с memcpy и т.п.
c++ - Why does std::bitset only support integral data types? Why is float not supported? - Stack Overflow

А как насчет union? Хотя это может быть не тру-плюсово :grinning_face_with_smiling_eyes:

#include <iostream>
#include <bitset>

using namespace std;

union U {
	float f;
	unsigned char c[sizeof(float)];
};

int main() {
	U u;
	u.f = 3.14;
	for (int j = sizeof(u) - 1; j >= 0; j--)
		for (int i = 7; i >= 0; --i) cout << ((u.c[j] >> i) & 1);
	cout << endl;
	
	float x = 3.14;
    for (int i = sizeof(x) - 1; i >= 0; i--)
        cout << bitset<8>(reinterpret_cast<char*>(&x)[i]);
    cout << endl;

    unsigned char c = 2;
    for (int i = 7; i >= 0; --i) cout << ((c >> i) & 1);

	return 0;
}