#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