Использование Bitset для отображения 16 бит в четыре группы по 4 бита в C++

Я работаю над заданием по программированию и использую функцию bitset‹> в C++ для печати двоичного представления целого числа на 16 бит. Мне трудно распечатать 16 бит в четыре группы по четыре бита с пробелом между ними. Как я могу сделать это с помощью функции битсета?

cout << "0b" << bitset<16>(integer) << "\t";

Это распечатывает, если целое число было 1

0b0000000000000001

То, что я пытаюсь распечатать, это

0b0000 0000 0000 0001

person Nicole    schedule 16.09.2017    source источник


Ответы (2)


Вы можете реализовать фильтрующий поток, но почему бы не упростить его?

auto the_number = std::bitset<16>(1);

std::cout << "0b";
int count = 0;
for(int i=the_number.size()-1; i>=0; i--)
{
    std::cout << std::bitset<16>(255)[i];
    if(++count == 4) {std::cout << " "; count = 0;}
}
person DrSvanHay    schedule 16.09.2017
comment
Хорошо, за исключением того, что ваше решение не выводит то, что, например, спрашивал человек... ваше выводит 0b0000 0000 1111 1111, в то время как спрашивающий, по-видимому, хочет 0b0000 0000 0000 0001 :) - person Dr t; 17.09.2017
comment
Я думаю, что ваш комментарий был не по настоящему, не так ли? Но ладно, я все равно отредактировал пример. - person DrSvanHay; 17.09.2017
comment
DrSvanHay совсем не по-настоящему... кроме сарказма и счастливого лица - person Dr t; 17.09.2017

Оператор << для наборов битов не предоставляет спецификатор формата, который разделяет полубайты. Вам придется перебирать биты самостоятельно и вводить разделители «вручную»:

int main() {

    int integer = 24234;
    bitset<16> bits(integer);
    cout << "0b";
    for (std::size_t i = 0; i < bits.size(); ++i) {
        if (i && i%4 == 0) { // write a space before starting a new nibble (except before the very first nibble)
            cout << ' ';
        }
        std::cout << bits[bits.size() - i - 1];
    }
    return 0;
}
person Stephan Lechner    schedule 16.09.2017
comment
Хорошо, за исключением того, что ваше решение не выводит то, что, например, спрашивал человек .... Ваше решение выводит 0b0101 0101 0111 1010, в то время как спрашивающий, по-видимому, хочет 0b0000 0000 0000 0001 :) - person Dr t; 17.09.2017
comment
@Drt нет. С этим не все в порядке, он печатает биты в неправильном порядке. - person DrSvanHay; 17.09.2017
comment
DrSvanHay ахххххххх вы правы!!! Ха-ха. Я был так взволнован, чтобы быть саркастичным, что я пропустил это!! :) - person Dr t; 17.09.2017
comment
О да. Это намного лучше. Думаю, я упустил прекрасную возможность отредактировать. - person Dr t; 17.09.2017