Здравствуйте, r1der, Вы писали:
R>смысл этого понятен.. просто пользуемся делением.. вопрос не в том. интересует как работает cout.hex() и потом вывод именнно в шестнадцатиричном формате.. то есть у объекта cout есть функция hex которая ставит каой то параметр формата вывода на значние шестнадцатиричной системы. Далее перегруженный оператор объекта cout, который выводит на дисплей, выводит именно в шестнадцатиричной форме, так вот вопрос как раз в том как работает этот метод.. то есть десятичное число выводит в шестнадцатиричной или восьмеричной формы.. может быть она с помощью побитовых операция делит на тетрады? или триады для шестнадцатиричной и потом от старшего к младшему сравнивает с определенной таблицей тетрад или триад и выводит соответствующее значение. может быть так?
Вместо того, чтобы галлюцинировать про перегруженные операторы, можно было бы
1) просто залезть в любой справочник — хотя бы в MSDN — и прочитать
2) дебаггером погрузиться в недра
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Перекуём баги на фичи!
Re[3]: Как переводить в разные системы счисления побитовыми
Здравствуйте, 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 можно специализировать, заменив % и / на & и >>
Для случая фиксированной ширины (когда надо вывести и ведущие нули) — можно развернуть цикл
Читал всевозможные книги, алгоритмические трюки для програмистов, фундаментальные алгоритмы, юзал поиск и гуглил, ничего толком не нашел. видимо не знаю основ.. допустим стоит задача перевести деасятичное число в 8 или 16 ричную систему или даже 4ричную.. как это сделать с помощью побитовых операций?
icq 314624
Re: Как переводить в разные системы счисления побитовыми опе
Здравствуйте, r1der, Вы писали:
R>.. допустим стоит задача перевести деасятичное число в 8 или 16 ричную систему или даже 4ричную.. как это сделать с помощью побитовых операций?
Опиши входные данные и что ты хочеш получить на выходе. Есть понятие числа, а есть представления числа. В компъютере все представления числа в двоичной системе, тебе их показывают в десятичной. Математические операции не изменяют представления, они изменяют число. Тоесть нельзя написать функцию которая из
int numb = 16;
//сделает
numb = A;
Вобщем, это я к чему... уточни вопрос.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re: Как переводить в разные системы счисления побитовыми опе
Здравствуйте, r1der, Вы писали:
R>Читал всевозможные книги, алгоритмические трюки для програмистов, фундаментальные алгоритмы, юзал поиск и гуглил, ничего толком не нашел. видимо не знаю основ.. допустим стоит задача перевести деасятичное число в 8 или 16 ричную систему или даже 4ричную.. как это сделать с помощью побитовых операций?
Может для тебя это станет сюрпризом, но работаешь ты исключительно с числами в двоичной системе
А преобразовать число в строку по нужной базе — вариантов множество: модификаторы вывода в поток, форматы printf, itoa(там хоть в 36-ричную форматируй).
Re[2]: Как переводить в разные системы счисления побитовыми
Здравствуйте, sokel, Вы писали:
S>Может для тебя это станет сюрпризом, но работаешь ты исключительно с числами в двоичной системе S>А преобразовать число в строку по нужной базе — вариантов множество: модификаторы вывода в поток, форматы printf, itoa(там хоть в 36-ричную форматируй).
Здравствуйте, 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]: Как переводить в разные системы счисления побитовыми
Здравствуйте, sokel, Вы писали:
S>Здравствуйте, sokel, Вы писали:
S>>Может для тебя это станет сюрпризом, но работаешь ты исключительно с числами в двоичной системе S>>А преобразовать число в строку по нужной базе — вариантов множество: модификаторы вывода в поток, форматы printf, itoa(там хоть в 36-ричную форматируй).
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]: Как переводить в разные системы счисления побитовыми
Здравствуйте, r1der, Вы писали:
R>есть функций printinhex которая принимает десятичное число, далее с помощью побитовых операций должна разложить видимо на тетрады и вывести в шестнадцатиричном формате..интересует эта функция.. а точнее как она работает в объекте cout
Почему ты решаил что она должна это сделать с помощью побитовых операций? Возможно в какой-то реализации автор вместо деления на 16 сдвинул на 4 бита вправо с помощью операции >>. Но это не означает что так одно должно быть, кроме того чтобы перевести в систему исчисления основание которой не степень двойки тебе прийдется делать обычное деление и никакие трюки со сдвигами тебе не помогут.
P.S. Это не ты спрашивал по "побитовое деление"?
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re[5]: Как переводить в разные системы счисления побитовыми
A>это не побитовая операция. Искать надо в другом направлении. Для начала почитать про cout и перегрузку операций.
ОО я наконец-то понял причем тут побитовые операции)) спасибо!
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re[4]: Как переводить в разные системы счисления побитовыми
Здравствуйте, 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]: Как переводить в разные системы счисления побитовыми
Здравствуйте, ankorol, Вы писали:
A>Здравствуйте, alzt, Вы писали:
A>>Здесь A>>
A>>cout<<'F';
A>>
A>>это не побитовая операция. Искать надо в другом направлении. Для начала почитать про cout и перегрузку операций. A>ОО я наконец-то понял причем тут побитовые операции)) спасибо!
я сосвсем про другое говорил))
icq 314624
Re[5]: Как переводить в разные системы счисления побитовыми
Здравствуйте, r1der, Вы писали:
R>Читал всевозможные книги, алгоритмические трюки для програмистов, фундаментальные алгоритмы, юзал поиск и гуглил, ничего толком не нашел. видимо не знаю основ.. допустим стоит задача перевести деасятичное число в 8 или 16 ричную систему или даже 4ричную.. как это сделать с помощью побитовых операций?
Десятичное число, это что? Последовательность символов от 0 до 9?
Если в такой формулировке, то задача разбивается на две: прочитать эту последовательность в какое-нибудь внутреннее представление, пригодное для работы (ну например, в unsigned int), и потом превратить это внутреннее представление в последовательность шестнадцетеричных цифр.
Чтобы прочитать десятичное число надо, очевидно, уметь складывать и умножать на 10. Умножение на 10 легко представляется в виде сдвигов и сложений, если вспомнить, что N*10 == N*8 + N*2, а умножения не степень двойки легко заменяются сдвигами.
Чтобы преобразовать число из внутреннего представления в 16-ричную систему, надо уметь делить на 16 с остатком. Поскольку 16 — степень двойки, то деление можно заменить сдвигом, взятие остатка — побитовым and.
Re[6]: Как переводить в разные системы счисления побитовыми