#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 *
tochar *
. Вы должны быть осведомлены о чем-то, называемом порядковым номером?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:
Я вижу две вещи:
- цикл в
i
должен начинаться с0
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. упс, нет, там был грамматический недостаток. Я прошу прощения.