Двоичные строки печатаются задом наперед

#c #printing #binary #bit

Вопрос:

Я попытался найти способ заставить битовое представление переменной работать с помощью макроса. Код печатает двоичные строки в обратном порядке, так как я относительно новичок c , я думал, что проблема заключалась в индексации, так как она должна начинаться с высокого уровня, а затем вести обратный отсчет.

 #include <iostream>
#include <memory>
#include <climits>


#define EXTRACTBIT(ith,ch)(std::cout<<((*ch >> ith) amp; 1 ? 1 : 0))

template < typename T > void printlnbits (T v)
{
    const int s = sizeof (T) * CHAR_BIT;
    auto const bytes_begining{reinterpret_cast<unsigned char const *>(std::addressof(v))};
    auto byte{bytes_begining};
    auto bit_index_in_byte{0};
    for (int n = s - 1; n >=0; --n)
    {
        EXTRACTBIT(bit_index_in_byte, amp;(*byte));
          bit_index_in_byte;
        if (CHAR_BIT == bit_index_in_byte){
            std::cout << " ";
            bit_index_in_byte = 0;
              byte;
        }
    }
    std::cout << "  " << s << " bits" << std::endl;
}

int main ()
{
    const char a = 'a';
    const char b = 2;
    printlnbits (a);
    printlnbits (b);

    return 0;
}
 

Результат:

 bit_index_in_byte = 0;
  bit_index_in_byte;
10000110  8 bits //correct 01100001
01000000  8 bits //correct 00000010 

bit_index_in_byte = 8;
--bit_index_in_byte;
00110000   8 bits //correct 01100001
00000001   8 bits //correct 00000010
 

То, что я пробовал, не удалось, первое правильное, но обратное, а другое неверно. Я также хотел бы добавить, что буду признателен за любую помощь или другие предложения по упрощению решения

Комментарии:

1. Код, который вы показываете, предназначен для теста 1, верно? Похоже, что при подсчете индекса вниз вам следует начинать с 7, а не с 8.

2. Это не решает вопроса, но значение (*ch >> ith) amp; 1 равно 1 или 0. Нет необходимости тестировать его и преобразовывать в 1 или 0. Т. е. избавьтесь от ?: . Кроме того, EXTRACTBIT должна быть функция. Здесь нет ничего полезного в использовании макроса.

Ответ №1:

Как указано в комментарии -500, у вас должен быть правильный результат, если вы начнете с 7 этого

  auto bit_index_in_byte{7};
    for (int n = s - 1; n >=0; --n)
    {
        EXTRACTBIT(bit_index_in_byte, amp;(*byte));
        --bit_index_in_byte;
        if (-1 == bit_index_in_byte)
        {
            std::cout << " ";
            bit_index_in_byte = 7;
              byte;
        }
    }`
 

Результат:

 01100001 8 bits
00000010 8 bits