тип шаблона в двоичном представлении

#c

#c

Вопрос:

 #include <iostream>

using namespace std;

template<class T>
void toBinary(T num) 
{
  char *  numi = reinterpret_cast<char*>(amp;num);

  for (int i = 1; i <= sizeof(T); i  )  
  {
      for( int j = 1 ; j <= 8;   j )
      {
          char byte = numi[i];
          cout << ( byte amp; j  ? 1 :  0);    
      }
  }
  cout << endl << endl;
}

int main() 
{   
  toBinary(1); 
  std::cin.get();
}
  

результат равен 0000000000000…
Не могли бы вы сказать мне, где моя ошибка?

Редактировать:

 #include <iostream>
#include <bitset>
#include <iomanip>
#include <boost/format.hpp>
using namespace std;

template<class T> bitset<sizeof(T)*CHAR_BIT> toBinary(const T num) 
{
    bitset<sizeof(T)*CHAR_BIT> mybits;
    const char * const p = reinterpret_cast<const char*>(amp;num);
    for (int i = sizeof(T)*CHAR_BIT-1 ; i >= 0 ; --i)
        mybits.set(i, (*(p)amp;(1<<i)));
    return mybits;
}

template<class T> void printBinary(T num, ostreamamp; stream = cout)
{
    stream << boost::format("%-35s %-8s %-32sn")  %  typeid(T).name() % num % toBinary(num).to_string();
}

struct Foo{void bar(){}};

int main() 
{   
  printBinary(-8);
  printBinary(8u);
  printBinary('a');
  printBinary(8.2f);  
  printBinary("Overflow");
  printBinary(main);
  printBinary(amp;Foo::bar);
  printBinary(8.2);
  std::cin.get();
}
  

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

1. Вы вводите тип в int * to char * . Вы должны быть осведомлены о чем-то, называемом порядковым номером?

2. Ну, массивы начинаются с нуля, а не с единицы. И вы должны использовать CHAR_BIT , а не 8.

3. я заменил 1 на 0 в первом цикле, но я все еще получаю неправильный результат 1010101000000

Ответ №1:

Я думаю, если бы я действительно хотел исправить этот код как есть, я бы сделал это следующим образом:

 #include <iostream>
#include <string>

using namespace std;

template<class T>
    void toBinary(const Tamp; num) 
{
  const char *const  asbytes = reinterpret_cast<const char* const>(amp;num);

  for (const char* byte=asbytes   sizeof(T) - 1; byte>=asbytes; byte--)
  {
      for ( int bitnr = 7; bitnr>=0; bitnr-- )
      {
          cout << ( (*byte amp; (1<<bitnr))  ? 1 :  0);    
      }
  }
  cout << endl << endl;
}

int main() 
{   
  toBinary(1); 
  std::cin.get();
}
  

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

1. и остальные исправления. просто добавил больше const в party, чтобы вы могли бинаризовать нетривиальные типы

2. Как представлены числа в памяти, я не понимаю, почему нам нужно отменить оба цикла

3. Я действительно ничего об этом не знаю. Вот почему упоминался другой плакат Endianness , и это нетривиально. Я предположил, что это просто домашнее задание — и я надеюсь, что вы не считаете это хорошей практикой кодирования; В частности, вам лучше не планировать использовать это для серьезной сериализации объектов 🙂

Ответ №2:

Я вижу две вещи:

  1. цикл в i должен начинаться с 0
  2. j должно быть j <<= 1 .

Действительно,

 1      = 0b00000001
1 << 1 = 0b00000010
1 << 2 = 0b00000100
...
  

Сравните это с тем, что вы делаете:

 1     = 0b00000001
1   1 = 0b00000010
1   2 = 0b00000011
1   3 = 0b00000100
  

это не то, что вы хотите.

Кроме того, стандарт не гарантирует, что в байте содержится 8 бит. Тип char гарантированно равен одному байту, sizeof размер измеряется в байтах, а чтобы узнать количество битов в байте, используйте CHAR_BIT макрос:

 for (j = 1; j <= 1 << CHAR_BIT; j <<= 1)
{
    char byte = numi[i];
    cout << (byte amp; j ? 1 : 0);    
}  
  

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

1. У меня все еще есть сомнения, кажется, применяя j * = 2, я просто проверю первые младшие 4 бита? Поскольку символ состоит из 8 бит, кажется, я откажусь от 4 бит с этим кодом, нет?

Ответ №3:

byte amp; j не проверяет, установлен ли j ‘-й бит, он просто проверяет, установлены ли какие-либо из битов, которые установлены в j , также в byte .

Чтобы проверить наличие определенного бита, используйте (byte amp; (1 << j)) != 0 (в данном случае j основано на нуле!).

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

1. Извините, но я не понимаю ваше первое предложение ( «он просто проверяет, установлены ли какие-либо из битов is в j, также установлены в byte»)

2.возможно, возьмите ссылку: учебное пособие msdn cplusplus Википедия и т.д.

3. упс, нет, там был грамматический недостаток. Я прошу прощения.