Как переводить в разные системы счисления побитовыми операци
От: r1der Россия  
Дата: 16.11.09 05:36
Оценка: :)
Читал всевозможные книги, алгоритмические трюки для програмистов, фундаментальные алгоритмы, юзал поиск и гуглил, ничего толком не нашел. видимо не знаю основ.. допустим стоит задача перевести деасятичное число в 8 или 16 ричную систему или даже 4ричную.. как это сделать с помощью побитовых операций?
icq 314624
Re: Как переводить в разные системы счисления побитовыми опе
От: ankorol Украина  
Дата: 16.11.09 08:06
Оценка:
Здравствуйте, r1der, Вы писали:

R>.. допустим стоит задача перевести деасятичное число в 8 или 16 ричную систему или даже 4ричную.. как это сделать с помощью побитовых операций?


Опиши входные данные и что ты хочеш получить на выходе. Есть понятие числа, а есть представления числа. В компъютере все представления числа в двоичной системе, тебе их показывают в десятичной. Математические операции не изменяют представления, они изменяют число. Тоесть нельзя написать функцию которая из
int numb = 16;
//сделает
numb = A;

Вобщем, это я к чему... уточни вопрос.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re: Как переводить в разные системы счисления побитовыми опе
От: sokel Россия  
Дата: 16.11.09 08:12
Оценка:
Здравствуйте, r1der, Вы писали:

R>Читал всевозможные книги, алгоритмические трюки для програмистов, фундаментальные алгоритмы, юзал поиск и гуглил, ничего толком не нашел. видимо не знаю основ.. допустим стоит задача перевести деасятичное число в 8 или 16 ричную систему или даже 4ричную.. как это сделать с помощью побитовых операций?


Может для тебя это станет сюрпризом, но работаешь ты исключительно с числами в двоичной системе
А преобразовать число в строку по нужной базе — вариантов множество: модификаторы вывода в поток, форматы printf, itoa(там хоть в 36-ричную форматируй).
Re[2]: Как переводить в разные системы счисления побитовыми
От: sokel Россия  
Дата: 16.11.09 08:48
Оценка:
Здравствуйте, sokel, Вы писали:

S>Может для тебя это станет сюрпризом, но работаешь ты исключительно с числами в двоичной системе

S>А преобразовать число в строку по нужной базе — вариантов множество: модификаторы вывода в поток, форматы printf, itoa(там хоть в 36-ричную форматируй).

пример для размышлений:
void print_number(int num, int base)
{
    static const char digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    bool negative = (num < 0);
    if(negative) num = -num;
    char buf[34]; buf[33] = 0; char* str = &buf[33];
    while(num >= base)
    {
        div_t d = div(num, base);
        *--str = digits[d.rem];
        num = d.quot;
    }
    *--str = digits[num];
    if(negative) *--str = '-';
    std::cout << str << std::endl;
}

int main() 
{
    print_number(123456789, 16);
}
Re[2]: Как переводить в разные системы счисления побитовыми
От: r1der Россия  
Дата: 16.11.09 09:24
Оценка:
Здравствуйте, ankorol, Вы писали:

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


R>>.. допустим стоит задача перевести деасятичное число в 8 или 16 ричную систему или даже 4ричную.. как это сделать с помощью побитовых операций?


A>Опиши входные данные и что ты хочеш получить на выходе. Есть понятие числа, а есть представления числа. В компъютере все представления числа в двоичной системе, тебе их показывают в десятичной. Математические операции не изменяют представления, они изменяют число. Тоесть нельзя написать функцию которая из

A>
A>int numb = 16;
A>//сделает
A>numb = A;
A>

A>Вобщем, это я к чему... уточни вопрос.

есть функций printinhex которая принимает десятичное число, далее с помощью побитовых операций должна разложить видимо на тетрады и вывести в шестнадцатиричном формате..интересует эта функция.. а точнее как она работает в объекте cout
icq 314624
Re[3]: Как переводить в разные системы счисления побитовыми
От: r1der Россия  
Дата: 16.11.09 09:30
Оценка:
Здравствуйте, sokel, Вы писали:

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


S>>Может для тебя это станет сюрпризом, но работаешь ты исключительно с числами в двоичной системе

S>>А преобразовать число в строку по нужной базе — вариантов множество: модификаторы вывода в поток, форматы printf, itoa(там хоть в 36-ричную форматируй).

S>пример для размышлений:

S>
S>void print_number(int num, int base)
S>{
S>    static const char digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
S>    bool negative = (num < 0);
S>    if(negative) num = -num;
S>    char buf[34]; buf[33] = 0; char* str = &buf[33];
S>    while(num >= base)
S>    {
S>        div_t d = div(num, base);
S>        *--str = digits[d.rem];
S>        num = d.quot;
S>    }
S>    *--str = digits[num];
S>    if(negative) *--str = '-';
S>    std::cout << str << std::endl;
S>}

S>int main() 
S>{
S>    print_number(123456789, 16);
S>}

S>


смысл этого понятен.. просто пользуемся делением.. вопрос не в том. интересует как работает cout.hex() и потом вывод именнно в шестнадцатиричном формате.. то есть у объекта cout есть функция hex которая ставит каой то параметр формата вывода на значние шестнадцатиричной системы. Далее перегруженный оператор объекта cout, который выводит на дисплей, выводит именно в шестнадцатиричной форме, так вот вопрос как раз в том как работает этот метод.. то есть десятичное число выводит в шестнадцатиричной или восьмеричной формы.. может быть она с помощью побитовых операция делит на тетрады? или триады для шестнадцатиричной и потом от старшего к младшему сравнивает с определенной таблицей тетрад или триад и выводит соответствующее значение. может быть так?


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]: Как переводить в разные системы счисления побитовыми
От: Кодт Россия  
Дата: 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>>
Перекуём баги на фичи!
Re[4]: Как переводить в разные системы счисления побитовыми
От: Кодт Россия  
Дата: 16.11.09 10:01
Оценка: +1 :)))
Здравствуйте, r1der, Вы писали:

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


Вместо того, чтобы галлюцинировать про перегруженные операторы, можно было бы
1) просто залезть в любой справочник — хотя бы в MSDN — и прочитать
2) дебаггером погрузиться в недра
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Перекуём баги на фичи!
Re[3]: Как переводить в разные системы счисления побитовыми
От: ankorol Украина  
Дата: 16.11.09 10:12
Оценка:
Здравствуйте, r1der, Вы писали:

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

Почему ты решаил что она должна это сделать с помощью побитовых операций? Возможно в какой-то реализации автор вместо деления на 16 сдвинул на 4 бита вправо с помощью операции >>. Но это не означает что так одно должно быть, кроме того чтобы перевести в систему исчисления основание которой не степень двойки тебе прийдется делать обычное деление и никакие трюки со сдвигами тебе не помогут.
P.S. Это не ты спрашивал по "побитовое деление"?
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re[4]: Как переводить в разные системы счисления побитовыми
От: alzt  
Дата: 17.11.09 11:20
Оценка: 1 (1)
Здравствуйте, r1der, Вы писали:

Здесь
cout<<'F';

это не побитовая операция. Искать надо в другом направлении. Для начала почитать про cout и перегрузку операций.
Re[5]: Как переводить в разные системы счисления побитовыми
От: ankorol Украина  
Дата: 17.11.09 11:45
Оценка:
Здравствуйте, alzt, Вы писали:

A>Здесь

A>
A>cout<<'F';
A>

A>это не побитовая операция. Искать надо в другом направлении. Для начала почитать про cout и перегрузку операций.
ОО я наконец-то понял причем тут побитовые операции)) спасибо!
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re[4]: Как переводить в разные системы счисления побитовыми
От: r1der Россия  
Дата: 17.11.09 16:06
Оценка:
Здравствуйте, ankorol, Вы писали:

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


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

A>Почему ты решаил что она должна это сделать с помощью побитовых операций? Возможно в какой-то реализации автор вместо деления на 16 сдвинул на 4 бита вправо с помощью операции >>. Но это не означает что так одно должно быть, кроме того чтобы перевести в систему исчисления основание которой не степень двойки тебе прийдется делать обычное деление и никакие трюки со сдвигами тебе не помогут.
A>P.S. Это не ты спрашивал по "побитовое деление"?

я спрашивал) я понимаю что тут никакие рюки не помогут. в универе задают. и сам параллельно пытаюсь разобраться.. вообщем функцию превода например в шестнадчатиричную написал так..


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[6]: Как переводить в разные системы счисления побитовыми
От: r1der Россия  
Дата: 17.11.09 16:07
Оценка:
Здравствуйте, ankorol, Вы писали:

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


A>>Здесь

A>>
A>>cout<<'F';
A>>

A>>это не побитовая операция. Искать надо в другом направлении. Для начала почитать про cout и перегрузку операций.
A>ОО я наконец-то понял причем тут побитовые операции)) спасибо!

я сосвсем про другое говорил))
icq 314624
Re[5]: Как переводить в разные системы счисления побитовыми
От: ankorol Украина  
Дата: 17.11.09 17:25
Оценка:
Здравствуйте, r1der, Вы писали:

R>
R>void PrintInHex(int n)
R>{
R>    int x,pt;
R>    if (n<255) x=8;
R>    else if (n<65536) x=16;
R>    else x=32;
R>    for (int i=x/4;i;i--)
R>    {
R>        pt=((n>>4*(i-1))&0xF);
R>        switch (pt)
R>        {
R>        case 0:break;
R>        case 10:cout<<'A';break;
R>        case 11:cout<<'B';break;
R>        case 12:cout<<'C';break;
R>        case 13:cout<<'D';break;
R>        case 14:cout<<'E';break;
R>        case 15:cout<<'F';break;
R>        default: cout<<pt;
R>        }
R>    }
R>}
R>


R>преподша говорит что неверно.. вот и пытаюсь понять суть чего я не понимаю.

А что у тебя получается для n=255?
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re: Как переводить в разные системы счисления побитовыми опе
От: Pzz Россия https://github.com/alexpevzner
Дата: 17.11.09 18:23
Оценка:
Здравствуйте, r1der, Вы писали:

R>Читал всевозможные книги, алгоритмические трюки для програмистов, фундаментальные алгоритмы, юзал поиск и гуглил, ничего толком не нашел. видимо не знаю основ.. допустим стоит задача перевести деасятичное число в 8 или 16 ричную систему или даже 4ричную.. как это сделать с помощью побитовых операций?


Десятичное число, это что? Последовательность символов от 0 до 9?

Если в такой формулировке, то задача разбивается на две: прочитать эту последовательность в какое-нибудь внутреннее представление, пригодное для работы (ну например, в unsigned int), и потом превратить это внутреннее представление в последовательность шестнадцетеричных цифр.

Чтобы прочитать десятичное число надо, очевидно, уметь складывать и умножать на 10. Умножение на 10 легко представляется в виде сдвигов и сложений, если вспомнить, что N*10 == N*8 + N*2, а умножения не степень двойки легко заменяются сдвигами.

Чтобы преобразовать число из внутреннего представления в 16-ричную систему, надо уметь делить на 16 с остатком. Поскольку 16 — степень двойки, то деление можно заменить сдвигом, взятие остатка — побитовым and.
Re[6]: Как переводить в разные системы счисления побитовыми
От: r1der Россия  
Дата: 17.11.09 20:47
Оценка:
Здравствуйте, ankorol, Вы писали:

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


R>>
R>>void PrintInHex(int n)
R>>{
R>>    int x,pt;
R>>    if (n<255) x=8;
R>>    else if (n<65536) x=16;
R>>    else x=32;
R>>    for (int i=x/4;i;i--)
R>>    {
R>>        pt=((n>>4*(i-1))&0xF);
R>>        switch (pt)
R>>        {
R>>        case 0:break;
R>>        case 10:cout<<'A';break;
R>>        case 11:cout<<'B';break;
R>>        case 12:cout<<'C';break;
R>>        case 13:cout<<'D';break;
R>>        case 14:cout<<'E';break;
R>>        case 15:cout<<'F';break;
R>>        default: cout<<pt;
R>>        }
R>>    }
R>>}
R>>


R>>преподша говорит что неверно.. вот и пытаюсь понять суть чего я не понимаю.

A>А что у тебя получается для n=255?

понял исправил.. спасибо — не заметил)
icq 314624
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.