Как работает манипулятор hex объекта cout.
От: r1der Россия  
Дата: 16.11.09 05:34
Оценка:
Интересует внутренее устройство, каким образом все выводиться в формате hex. Можно функцию которая используется там? где ее можно взять? как создать такой член класса который можно передавать таким способом? то есть есть перегруженный оператор вывода принимаемый указатель на функцию?
icq 314624
Re: Как работает манипулятор hex объекта cout.
От: Кодт Россия  
Дата: 16.11.09 09:41
Оценка:
Здравствуйте, r1der, Вы писали:

R>Интересует внутренее устройство, каким образом все выводиться в формате hex. Можно функцию которая используется там? где ее можно взять? как создать такой член класса который можно передавать таким способом? то есть есть перегруженный оператор вывода принимаемый указатель на функцию?


cout<<hex просто вызывает cout.setf(ios_base::hex,ios_base::basefield), устанавливая флаг форматирования "шестнадцатирично".

Далее уже сам поток, ориентируясь на флаги, сделает что-то типа printf("%X",value) в свой буфер.

Посмотреть можно очень просто: взять исходники STL + CRT и хотя бы залезть туда отладчиком.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Перекуём баги на фичи!
Re: Как работает манипулятор hex объекта cout.
От: alzt  
Дата: 17.11.09 11:25
Оценка:
Здравствуйте, r1der, Вы писали:

R>Интересует внутренее устройство, каким образом все выводиться в формате hex. Можно функцию которая используется там? где ее можно взять? как создать такой член класса который можно передавать таким способом? то есть есть перегруженный оператор вывода принимаемый указатель на функцию?


Уже ответили. А можно узнать цель?
Манипулятор hex служит всего лишь для удобства. Синтаксический сахар. Как я понимаю — цель получить строку с шестнадцатеричным представлением числа? Либо надо создать функцию, которая получает на вход десятичное число, а возвращает его аналого в шестнадцатеричной системе?
Re[2]: Как работает манипулятор hex объекта cout.
От: r1der Россия  
Дата: 17.11.09 15:57
Оценка:
Здравствуйте, alzt, Вы писали:

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


R>>Интересует внутренее устройство, каким образом все выводиться в формате hex. Можно функцию которая используется там? где ее можно взять? как создать такой член класса который можно передавать таким способом? то есть есть перегруженный оператор вывода принимаемый указатель на функцию?


A>Уже ответили. А можно узнать цель?

A>Манипулятор hex служит всего лишь для удобства. Синтаксический сахар. Как я понимаю — цель получить строку с шестнадцатеричным представлением числа? Либо надо создать функцию, которая получает на вход десятичное число, а возвращает его аналого в шестнадцатеричной системе?

да нужно именно это.. интересовало именно как реализовано там. оказывается с помощью принтфа..) а принтф видимо реализован на ассемблере?=) вот это инетерсно.. как же это работает внутри.. а функцию первода написал вот такую


void PrintInHex(int n)
{
    int x,pt;
    if (n<255) x=8;
    else if (n<65536) x=16;
    else x=32;
    for (int i=x/4;i;i--)
    {
        pt=((n>>4*(i-1))&0xF);
        switch (pt)
        {
        case 0:break;
        case 10:cout<<'A';break;
        case 11:cout<<'B';break;
        case 12:cout<<'C';break;
        case 13:cout<<'D';break;
        case 14:cout<<'E';break;
        case 15:cout<<'F';break;
        default: cout<<pt;
        }
    }
}
icq 314624
Re[3]: Как работает манипулятор hex объекта cout.
От: Кодт Россия  
Дата: 17.11.09 16:15
Оценка: 1 (1)
Здравствуйте, r1der, Вы писали:

A>>Манипулятор hex служит всего лишь для удобства. Синтаксический сахар. Как я понимаю — цель получить строку с шестнадцатеричным представлением числа? Либо надо создать функцию, которая получает на вход десятичное число, а возвращает его аналого в шестнадцатеричной системе?


R>да нужно именно это.. интересовало именно как реализовано там. оказывается с помощью принтфа..) а принтф видимо реализован на ассемблере?=) вот это инетерсно.. как же это работает внутри.. а функцию первода написал вот такую


А смысл? Вместо того, чтобы готовыми манипуляторами воспользоваться
#include <iostream>
#include <iomanip>
using namespace std;

ostream& print_hex(ostream& ost, unsigned i)
{
    return ost
    << setw((i&0xFFFF0000) ? 8 : (i&0xFF00) ? 4 : 2) // видимо, именно эта логика тебе была нужна
    << setfill('0') // и, видимо, про это ты не подозревал
    << hex
    << i;
}

// немножко сахара
struct as_hex
{
    unsigned i;
    explicit as_hex(unsigned i) : i(i) {}
    friend ostream& operator << (ostream& ost, as_hex x) { return print_hex(ost, x.i); }
};

// вот ещё такая фигня
ostream& hex32(ostream& ost) { return ost << setw(8) << setfill('0') << hex; }
ostream& hex16(ostream& ost) { return ost << setw(4) << setfill('0') << hex; }
ostream& hex8 (ostream& ost) { return ost << setw(2) << setfill('0') << hex; }


int main()
{
    print_hex(cout, 12) << ' '; // 0C
    print_hex(cout, 1234) << ' '; // 04D2
    print_hex(cout, 123456) << endl; // 0012E240

    cout << as_hex(12) << ' ' << as_hex(1234) << ' ' << as_hex(123456) << endl;

    cout << hex32 << 1234 << endl; // 000004D2
}
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.