Нужно вывести битовые данные числовых значений

Нужно вывести битовые данные числовых значений из переменных. Написал программу, она не выводит последний бит, не могу понять причину. Делаю всё по заданию, нужно использовать операции побитовых сдвигов.

template<typename T>
void to_binary(T x)
{
    unsigned char* pb;
    pb = (unsigned char*)&x;
    size_t size_byte = sizeof(x) * 8;
    int *res = new int[size_byte];
    for (int i = 0; i < sizeof(x); i++)
        for (int j = 0; j < 8; j++)
            res[(i * 8) + j] = (pb[i] >> j) % 2;
    int b = 0;
    for (size_t i = size_byte - 1; i > 0; i--)
    {
        cout << res[i];
    }
    cout << endl;
}

int main()
{
    unsigned int FourCel = 7;
    to_binary(FourCel);
    return 0;
}

Ответы (3 шт):

Автор решения: FelixF

EOF

правильно ответил, нужно в цикле изменить тип size_t на int и условие вывода изменить на i>=0

→ Ссылка
Автор решения: wololo

Вы выводите все элементы массива res, кроме элемента с индексом 0. Перепишите цикл вывода одним из следующих способов:

//Способ №1:
for (std::size_t i = size_byte; i > 0; i--) {
    std::cout << res[i - 1];
}

//Способ №2:
for (std::size_t i = size_byte - 1; i < std::size_t(-1); i--) {
    std::cout << res[i];
}

//Способ №3:
#include <cstddef>
...
for (std::ptrdiff_t i = size_byte - 1; i >= 0; i--) {
    std::cout << res[i];
}

//Способ №4:
for (std::size_t i = size_byte; i-- > 0;) {
    std::cout << res[i];
}

Третий способ следует использовать с осторожностью. Если значение size_byte - 1 больше чем std::numeric_limits<std::ptrdiff_t>::max(), то цикл вывода будет работать неправильно.

Есть мнение, что из предложенных способов четвёртый наиболее предпочтителен.


В функции to_binary вы выделяете память (int *res = new int[size_byte];), но нигде её не освобождаете. Память необходимо освободить.

А вообще, если ваша цель просто вывести последовательность битов, то в дополнительном массиве нет необходимости. Пример:

#include <iostream>
#include <climits>
#include <cstddef>

template <typename T>
void to_binary(T x)
{
    const unsigned char* byte = reinterpret_cast<const unsigned char*>(&x + 1);

    for (std::size_t i = sizeof(x); i > 0; --i)
    {
        --byte;
        for (std::size_t j = CHAR_BIT; j > 0; --j)
            std::cout << ( (*byte >> (j - 1)) & 1u );
        std::cout << ' ';
    }
    std::cout << std::endl;
}
→ Ссылка
Автор решения: Qwertiy
i > 0
~i

Так цикл будет выполняться на одну итерацию больше (при 0).

→ Ссылка