Как в поток вывести двоичное представление числа?
От: Fynjisx  
Дата: 10.10.10 07:44
Оценка:
Привет ВСем! Есть поток, ofstream.
В него вывожу так:
 ofstream ss;
 ...
 ss << number << endl;
 ...

видел манипуляторы, которые переводят число в hex, oct формат, а как быть если нужно в двоичном выбросить?
Заранее благодарю.
С уважением Fynjisx
Re: Как в поток вывести двоичное представление числа?
От: placement_new  
Дата: 10.10.10 08:06
Оценка:
Здравствуйте, Fynjisx, Вы писали:

F>Привет ВСем! Есть поток, ofstream.

F>В него вывожу так:
F>
F> ofstream ss;
F> ...
F> ss << number << endl;
F> ...
F>

F>видел манипуляторы, которые переводят число в hex, oct формат, а как быть если нужно в двоичном выбросить?
Самому написать?
Re: Как в поток вывести двоичное представление числа?
От: LaptevVV Россия  
Дата: 10.10.10 08:19
Оценка: 4 (2)
Здравствуйте, Fynjisx, Вы писали:

F>Привет ВСем! Есть поток, ofstream.

F>В него вывожу так:
F>
F> ofstream ss;
F> ...
F> ss << number << endl;
F> ...
F>

F>видел манипуляторы, которые переводят число в hex, oct формат, а как быть если нужно в двоичном выбросить?
В стандартном С++ нет двоичного манипулятора.
Из моей книжки (глава 14):

Например, пусть нам требуется выводить целые значения в двоичном виде. Напишем класс binary (листинг 14.13).

Листинг 14.13. «Манипулятор» для двоичного вывода
class binary
{ unsigned long k;
  public:
    binary(unsigned long k): k(k) {}
    friend ostream& operator<<(ostream& os, const binary& t);
};
inline ostream& operator<<(ostream& os, const binary& t)
{ const unsigned long MAX = numeric_limits<unsigned long>::max();
  unsigned long bit = ~(MAX >> 1);                    // старший бит
  while(bit) { os << (t.k & bit?'1':'0'); bit >>= 1; }
  return os;
}

В функции operator<< самыми важными являются две строки:

const unsigned long MAX = numeric_limits<unsigned long>::max();
unsigned long bit = ~(MAX >> 1);                    // старший бит

В первой строке в переменную MAX заносится максимально возможное беззнаковое целое число, определенное в стандартном классе числовых пределов numeric_limits.
ПРИМЕЧАНИЕ
Класс-шаблон numeric_limits<> определен в заголовоке <limits>.
В двоичной записи это максимальное число представляет собой набор единичных битов:
1111...111
Во второй строке все биты числа сдвигаются вправо на один разряд; самый правый бит (младший разряд числа) теряется; в самый левый бит (старший разряд числа) заносится ноль, так как тип — беззнаковый. Таким образом, в результате сдвига образуется такая конфигурация битов:
0111...111
Потом эта конфигурация инвертируется операцией ~ и превращается в
1000...000
Это значение и заносится в переменную bit. Далее старшая единичка в цикле сдвигается на 1 разряд, пока значение bit не станет равно 0.
Такой класс позволяет нам выводить любые целые в двоичном виде, например:

short a = -2;
cout << binary(a) << endl;


Однако этот класс выводит в выходной поток всегда такое количество битом, которое содержится в типе unsigned long. Мы легко можем преобразовать этот класс в шаблон, который позволит выводить для беззнаковых целых нужное количество битов (листинг 14.14).

Листинг 14.14. Эффектор-шаблон
// опережающие объявления
template <class T> class binary;
template<class T> ostream& operator<<(ostream& os, const binary<T>& t);
// класс-шаблон
template <class T>
class binary
{ T k;
  public:
    binary(T k): k(k) {}
    friend ostream& operator<< <>(ostream& os, const binary<T>& t);
};
template<class T>
inline
ostream& operator<<(ostream& os, const binary<T>& t)
{ T MAX = numeric_limits<T>::max();
  T bit = ~(MAX >> 1);
  while(bit)
  { os << (t.k & bit?'1':'0'); bit >>= 1; }
  return os;
}


Обратите внимание на опережающие объявления и прототип функции-шаблона operator<< в классе binary.
Использовать данный класс-шаблон в качестве манипулятора можно так:

short a = -2;
cout << binary<unsigned short>(a) << endl;
cout << binary<unsigned char>(128)<< endl;


В результате на экран выводится следующее:
1111111111111110
10000000
Как видим, на экране ровно столько битов, сколько занимают типы unsigned short и unsigned char. Заметим, что использовать в качестве аргумента шаблона знаковый тип нельзя — программа зациклится!

Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[2]: Как в поток вывести двоичное представление числа?
От: Fynjisx  
Дата: 10.10.10 10:05
Оценка: -1
Здравствуйте, placement_new, Вы писали:

_>Здравствуйте, Fynjisx, Вы писали:


F>>Привет ВСем! Есть поток, ofstream.

F>>В него вывожу так:
F>>
F>> ofstream ss;
F>> ...
F>> ss << number << endl;
F>> ...
F>>

F>>видел манипуляторы, которые переводят число в hex, oct формат, а как быть если нужно в двоичном выбросить?
_>Самому написать?
Капитан очевидность?
Заранее благодарю.
С уважением Fynjisx
Re[2]: Как в поток вывести двоичное представление числа?
От: Fynjisx  
Дата: 10.10.10 10:08
Оценка:
LVV>Здравствуйте, LaptevVV, Вы писали:
...
LVV>[/q]
О спасибо большое, за очень исчерпывающий ответ... Не ожидал даже... Просто выручили... А не моли бы сказать что это за книжка у Вас?
Ещё раз большое спасибо...(побольше бы таких людей на форумах)
Заранее благодарю.
С уважением Fynjisx
Re[2]: а дай-ка и я напишу
От: Pavel Dvorkin Россия  
Дата: 10.10.10 16:21
Оценка:
Здравствуйте, LaptevVV, Вы писали:

Правда, platform-dependent и без классов


void printbin(int x)
{
    __int64 y = x;
    int i = 32;
    while(i)
    {
        printf("%d", ((y  << (33-i))& 0x100000000I64) >> 32);
        i--;
    }
    printf("\n");
}

int _tmain(int argc, _TCHAR* argv[])
{
    printbin(100);
    return 0;
}




вариант без печати незначащих нулей оставляю желающим в качестве самостоятельного упражнения.

Кстати, на ассемблере можно бы обойтись без __int64. Просто сдвигать и брать флаг С.
With best regards
Pavel Dvorkin
Re[3]: нет, можно проще
От: Pavel Dvorkin Россия  
Дата: 10.10.10 16:33
Оценка:
и без __int64

void printbin(int x)
{
    int i = 32;
    while(i)
    {
        printf("%d", (x & 0x80000000) >> 31);
        i--;
        x <<= 1;
    }
    printf("\n");
}

int _tmain(int argc, _TCHAR* argv[])
{
    printbin(100);
    return 0;
}
With best regards
Pavel Dvorkin
Re[3]: Как в поток вывести двоичное представление числа?
От: LaptevVV Россия  
Дата: 10.10.10 19:19
Оценка:
Здравствуйте, Fynjisx, Вы писали:

LVV>>Здравствуйте, LaptevVV, Вы писали:

F>...
LVV>>[/q]
F>О спасибо большое, за очень исчерпывающий ответ... Не ожидал даже... Просто выручили... А не моли бы сказать что это за книжка у Вас?
F>Ещё раз большое спасибо...(побольше бы таких людей на форумах)
Первоисточник — в книге Брюса Эккеля. А я несколько модифицировал и в своей книжке написал...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Ops
От: Ops Россия  
Дата: 13.10.10 17:47
Оценка:
Здравствуйте, Fynjisx, Вы писали:

F>видел манипуляторы, которые переводят число в hex, oct формат, а как быть если нужно в двоичном выбросить?


http://tinyurl.com/389rpq7
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[3]: Как в поток вывести двоичное представление числа?
От: blackhearted Украина  
Дата: 13.10.10 17:58
Оценка: :)
Здравствуйте, Fynjisx, Вы писали:

F>Здравствуйте, placement_new, Вы писали:


_>>Здравствуйте, Fynjisx, Вы писали:


F>>>Привет ВСем! Есть поток, ofstream.

F>>>В него вывожу так:
F>>>
F>>> ofstream ss;
F>>> ...
F>>> ss << number << endl;
F>>> ...
F>>>

F>>>видел манипуляторы, которые переводят число в hex, oct формат, а как быть если нужно в двоичном выбросить?
_>>Самому написать?
F>Капитан очевидность?

Я сегодня за него.
В чём проблема?