Re[3]: Как переводить в разные системы счисления побитовыми
От: Кодт Россия  
Дата: 16.11.09 09:56
Оценка: 2 (2)
Здравствуйте, r1der, Вы писали:

R>есть функций printinhex которая принимает десятичное число, далее с помощью побитовых операций должна разложить видимо на тетрады и вывести в шестнадцатиричном формате..интересует эта функция.. а точнее как она работает в объекте cout


Зачем тетрады-шметрады. Обычная функция itoa(int value, char* buf, int radix), работает следующим способом
char* itoa(int value, char* buf, int radix)
{
    char const* const digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    char* end = buf;

    bool const sign = (value<0);
    value = abs(value);
    
    if(value == 0) // особый случай: нулю соответствует не пустая строка, а "0"
        *(end++) = digit[0];
    
    // раскладываем число на цифры (младшими разрядами вперёд)
    while(value != 0)
    {
        *(end++) = digit[value%radix];
        value /= radix;
    }
    
    if(sign) // дописываем после старшего разряда знак
        *(end++) = '-';
    
    *end = 0; // и дописываем концевой ноль
    
    // к этому моменту мы получили строку младшими разрядами вперёд
    // обращаем её
    strrev(buf);
    
    return buf;
}


Для случая radix=16 можно специализировать, заменив % и / на & и >>
Для случая фиксированной ширины (когда надо вывести и ведущие нули) — можно развернуть цикл
char* ultoh(unsigned value, char* buf)
{
    char const* const digits = "0123456789ABCDEF";
    buf[0] = digits[(value>>28)&15];
    buf[1] = digits[(value>>24)&15];
    buf[2] = digits[(value>>20)&15];
    buf[3] = digits[(value>>16)&15];
    buf[4] = digits[(value>>12)&15];
    buf[5] = digits[(value>> 8)&15];
    buf[6] = digits[(value>> 4)&15];
    buf[7] = digits[(value>> 0)&15];
    buf[8] = 0;
    return buf;
}
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.