Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Класс - шестнадцатеричное число 
:(
    Опции темы
xvr
Дата 6.11.2007, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(Ripper @ 6.11.2007,  17:33)
xvr, Завтра спрошу у препода. я уже незнаю чему верить
-2A - для шестнадцатеричных числе  не определно понятие отрицательное число (гдето выше писали) т.к. первый бит указывает на знак
значит ненужно вводить знак явно.

Если мы можем написать -42, то почему бы не написать -2A ?
И первый бит указывает на знак не у шестнадцатиричных чисел, а у чисел в дополнительном коде - это абсолютно независимые понятия. С тем же успехом мы можем считать десятичные числа представленными в дополнительном коде, т.е. например  (для 8ми битных чисел) 200 будет соотвествовать -56. Требовать от внешнего представления класса, что бы hex числа для ввода/вывода были представленны в дополнительном коде (равно как и влюбом другом), это все равно, что требовать, что бы вместо числа -56 вводили 200.

PM MAIL   Вверх
powerfox
Дата 6.11.2007, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 2
Всего: 97



Цитата(Ripper @  6.11.2007,  18:33 Найти цитируемый пост)
значит ненужно вводить знак явно.

Тебе просто советовали вводить дополнительную переменую для знака. Иначе нужно при любой операции "извлекать" знак из числа.

Добавлено через 1 минуту и 59 секунд
Цитата(xvr @  6.11.2007,  21:42 Найти цитируемый пост)
Если мы можем написать -42, то почему бы не написать -2A ?

xvr, цель 16-й чисел - облегчить работу с двоиным кодом. Кто работает с ними сразу может скачать, что в старшем бите.


--------------------
user posted image
PM WWW   Вверх
xvr
Дата 7.11.2007, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(powerfox @ 6.11.2007,  21:06)
Цитата(xvr @  6.11.2007,  21:42 Найти цитируемый пост)
Если мы можем написать -42, то почему бы не написать -2A ?

xvr, цель 16-й чисел - облегчить работу с двоиным кодом. Кто работает с ними сразу может скачать, что в старшем бите.

Цель 16х чисел (В ДАННОМ СЛУЧАЕ) облегчить реализацию класса - многобайтовое преобразование hex<->bin делается легче, чем dec<->bin, но что то мне кажется, что об облегчения реализации, которая требовала бы ЯВНОГО кодирования отрицательных чисел в дополнительном виде речь все таки не шла smile Все таки, когда программы пишутся для пользователей их (пользователей) никто не заставляет вводить отрицательные числа в дополнительном коде, и писать 4294967295 вместо -1
Ы?
PM MAIL   Вверх
powerfox
Дата 7.11.2007, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 2
Всего: 97



Цитата(xvr @  7.11.2007,  17:09 Найти цитируемый пост)
многобайтовое преобразование hex<->bin делается легче, чем dec<->bin

Не вижу принципиальной разницы. В С++ есть средства, которые позволяю быстро преобразовать dec в hex. Это всего несколько дополнительных строк.
И в условии явно сказано, что числа хранятся в прямом коде, а в прямом знак указывается в знаковом разряде. 

Цитата(xvr @  7.11.2007,  17:09 Найти цитируемый пост)
Все таки, когда программы пишутся для пользователей их (пользователей) никто не заставляет вводить отрицательные числа в дополнительном коде, и писать 4294967295 вместо -1

Согласен. Но "ЗАДАНИЕ" есть задание. Можно просто реализовать дополнительный конструктор для чисел, записанных в форме -N.


--------------------
user posted image
PM WWW   Вверх
Ripper
Дата 7.11.2007, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lonely soul...
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 30.6.2004
Где: г. Москва

Репутация: нет
Всего: 23



Препод сначала сказал что нужно знак задавать явно, + - . потом я спросил у меня же написано в дополнительном коде все нужно складывать, что это значит.Ну он говорит ладно тогда переводите в прямой код, знак задается в hex числе..
вообщем как я и предпологал 


--------------------
"Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом
PM MAIL ICQ   Вверх
xvr
Дата 7.11.2007, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(powerfox @ 7.11.2007,  17:11)
Цитата(xvr @  7.11.2007,  17:09 Найти цитируемый пост)
многобайтовое преобразование hex<->bin делается легче, чем dec<->bin

Не вижу принципиальной разницы. В С++ есть средства, которые позволяю быстро преобразовать dec в hex. Это всего несколько дополнительных строк.

И для многобайтовых (>8) чисел тоже есть? И давно?
Цитата

И в условии явно сказано, что числа хранятся в прямом коде, а в прямом знак указывается в знаковом разряде. 
Не хранятся, а ЗАДАЮТСЯ. Про формат хранения не сказано. Кроме того, знак для прямого представления может хранится где угодно - он не используется для выполнения операций (меняются сами операции, но знак в них не участвует)
Цитата

Цитата(xvr @  7.11.2007,  17:09 Найти цитируемый пост)
Все таки, когда программы пишутся для пользователей их (пользователей) никто не заставляет вводить отрицательные числа в дополнительном коде, и писать 4294967295 вместо -1

Согласен. Но "ЗАДАНИЕ" есть задание. Можно просто реализовать дополнительный конструктор для чисел, записанных в форме -N.
Собственно ЗАДАНИЕ этого не требовало smile
Да собственно сам автор уже уточнил:
Цитата

Препод сначала сказал что нужно знак задавать явно, + - . потом я спросил у меня же написано в дополнительном коде все нужно складывать, что это значит.Ну он говорит ладно тогда переводите в прямой код, знак задается в hex числе..
вообщем как я и предпологал 


PM MAIL   Вверх
Ripper
Дата 7.11.2007, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lonely soul...
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 30.6.2004
Где: г. Москва

Репутация: нет
Всего: 23



Теперь вопросы касательно самого языка. 
1)Как я всеже понял я должен перевести hex число в двоичное и записать его в массив. 
Код

_hex::_hex(char* s) {
     len=0;
     char *tmp; int x=0;
     for (; *s; s++) {
         tmp=HexToBin(*s);
         for(int j=0; j<4; j++,x++,tmp++) { 
                 number[x]=*tmp;
         }
         len++;
     }                   
     number[x]='\0'; 
      
}

Вот так коряво я это делаю, используя ф-ию:
Код

char *HexToBin(char dig) {
    switch(dig) {
     case '0': return "0000";
     case '1': return "0001";
     case '2': return "0010";
     case '3': return "0011";
     case '4': return "0100";
     case '5': return "0101";
     case '6': return "0110";
     case '7': return "0111";
     case '8': return "1000";
     case '9': return "1001";
     case 'A': return "1010";
     case 'B': return "1011";
     case 'C': return "1100";
     case 'D': return "1101";
     case 'E': return "1110";
     case 'F': return "1111";
    }
    return "";
}


Единственный вопрос почему последний элемент numer[x] а не number[x+1] = '\0'? что то я скока не считал получается вроде x+1. И может есть более прямой способ это сделать?
Теперь вопрос, а как перевести из массива чаров типа "101010101" в hex число (которое потом нужно будет вывести на экран). Т.е. мне нужно будет перегруживать куча операторов. Один из первых это "<<". Вот я что-то додуматься не могу, как бы это нормаьно сделать. 
Наверно не хватает знаний самого си. Я надеюсь я верно понимаю что в ф-ии приведенной выше return "1111" означает указатель на массив чаров 1111? на начала массива?  
По аналогии что-то не доходит как сделать. 


--------------------
"Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом
PM MAIL ICQ   Вверх
xvr
Дата 7.11.2007, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(Ripper @ 7.11.2007,  22:38)
Теперь вопросы касательно самого языка. 
1)Как я всеже понял я должен перевести hex число в двоичное и записать его в массив. 
Код

_hex::_hex(char* s) {
     len=0;
     char *tmp; int x=0;
     for (; *s; s++) {
         tmp=HexToBin(*s);
         for(int j=0; j<4; j++,x++,tmp++) { 
                 number[x]=*tmp;
         }
         len++;
     }                   
     number[x]='\0'; 
      
}

Вот так коряво я это делаю, используя ф-ию:
Код

char *HexToBin(char dig) {
    switch(dig) {
     case '0': return "0000";
     case '1': return "0001";
     case '2': return "0010";
     case '3': return "0011";
     case '4': return "0100";
     case '5': return "0101";
     case '6': return "0110";
     case '7': return "0111";
     case '8': return "1000";
     case '9': return "1001";
     case 'A': return "1010";
     case 'B': return "1011";
     case 'C': return "1100";
     case 'D': return "1101";
     case 'E': return "1110";
     case 'F': return "1111";
    }
    return "";
}



Не надо так делать. Это САМЫЙ неудобный вид хранения числа.
Цитата

Теперь вопрос, а как перевести из массива чаров типа "101010101" в hex число (которое потом нужно будет вывести на экран). Т.е. мне нужно будет перегруживать куча операторов. Один из первых это "<<". 
Именно. И каждый оператор будет одним большим геморроем  smile 
Цитата

Единственный вопрос почему последний элемент numer[x] а не number[x+1] = '\0'? что то я скока не считал получается вроде x+1. 
Потому что в цикле for(int j=0; j<4; j++,x++,tmp++)  х будет инкрементирован после последней записи в выходной массив.
Цитата

Наверно не хватает знаний самого си. Я надеюсь я верно понимаю что в ф-ии приведенной выше return "1111" означает указатель на массив чаров 1111? на начала массива?  
Да. Получится строка с символьным битовым представлением, выполнять какие либо операции с ним крайне неудобно, хотя бы потому, что у него СТАРШИЕ разряды будут в начале массива, при этом их вес будет зависить от длинны числа, для арифметики это полный кирдык :(
Цитата

И может есть более прямой способ это сделать?
Есть. Надо использовать БИНАРНОЕ (а не текстовое) представление. Примерно так:
Код

template<int Length>
class Hex {
 int body[Length];

 void negate()
   {
     for(int i=0;i<Length;++i) body[i]=~body[i];
     *this += 1;
   }

public:

 Hex(const char* data)
  {
    bool do_invert=false;
    switch(*data)
     {
      case '+': ++data; break;
      case '-':  ++data; do_invert=true; break;
     }
   memset(body,0,sizeof(body));
   for(;*data;++data)
    {
      // Very slow, but very simple
      char s[2]={*data,0};
      *this <<= 4;
      *this += strtoul(s,0,16);
    }
   if (do_invert) negate();
  }

 Hex(int value)
  {
    body[0]=value;
    for(int i=1;i<Length;++i) body[i]=value<0?-1:0;
  }

 Hex& operator +=(const Hex&);
 Hex& operator -=(const Hex&);
 Hex& operator <<=(int);
 Hex& operator >>=(int);

 Hex operator +(const Hex& op2) {Hex rv(*this); rv+=op2; return rv;}
 Hex operator -(const Hex& op2) {Hex rv(*this); rv-=op2; return rv;}
 Hex operator <<(int op2) {Hex rv(*this); rv<<=op2; return rv;}
 Hex operator >>(int op2) {Hex rv(*this); rv>>=op2; return rv;}

 operator int() {return body[0];}
 ostream& operator<<(ostream&);
 istream& operator>>(istream&);
};
Арифметику сам напишешь smile

Это сообщение отредактировал(а) xvr - 7.11.2007, 23:23
PM MAIL   Вверх
powerfox
Дата 8.11.2007, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 2
Всего: 97



Цитата(xvr @  7.11.2007,  23:26 Найти цитируемый пост)
И для многобайтовых (>8) чисел тоже есть? И давно?

sizeof(long int) smile
Я думаю, что этого вполне достаточно в большинстве случаев (32, а уж про 64 так вообще молчу).


--------------------
user posted image
PM WWW   Вверх
Ripper
Дата 8.11.2007, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lonely soul...
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 30.6.2004
Где: г. Москва

Репутация: нет
Всего: 23



Не, мой мозг не в состоянии этого понять.
Попробую сделать хоть что-то, храня hex числа в массиве...  
:(



--------------------
"Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом
PM MAIL ICQ   Вверх
xvr
Дата 8.11.2007, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(powerfox @ 8.11.2007,  18:03)
Цитата(xvr @  7.11.2007,  23:26 Найти цитируемый пост)
И для многобайтовых (>8) чисел тоже есть? И давно?

sizeof(long int) smile

sizeof(long int) это 4 (максимум 8), хотелось бы больше smile
Цитата

Я думаю, что этого вполне достаточно в большинстве случаев (32, а уж про 64 так вообще молчу).
Угу, особенно для целей криптографии, арифметики большой точности (типа вычисления числа пи с точностью 1млн знаков) и пр  smile
Сдается мне, что там, где достаточно 32 или 64 бита, классы, такие как фигурировал в задании, не применяют - там и так все просто и прозрачно, со встроенными POD типами.

Добавлено через 1 минуту и 27 секунд
Цитата(Ripper @ 8.11.2007,  18:44)
Не, мой мозг не в состоянии этого понять.
Попробую сделать хоть что-то, храня hex числа в массиве...  
:(

Для начала напиши арифметику с таким представлением, если получится, то и hex ввод/вывод получится тоже.
PM MAIL   Вверх
Ripper
Дата 8.11.2007, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lonely soul...
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 30.6.2004
Где: г. Москва

Репутация: нет
Всего: 23



xvr, мне не хватает знаний по си. мы много чего в инсте не проходили и как бы отсюда следует что это использовать нельзя
И я уже так запарился с этим заданием ужас)
1)template<int Length> что это?
2)что такое <<= ? в побитовых операциях ненашел такого
3)что значит прибавить к *this число? Переместить указатель на объект? что получится?
4)в задании сказано использовать массив char-ов а не int-ов
5)+ ко всему я не понял этот код т.к. незнаю вообще встроенных в си ф-ий, конечно могу посмотреть где нибудь описание, но я к другому клоню - что щас мне это совсем тяжко. Препод сказал сначала можно в hex виде хранить т.е. в массиве чаров 16ричные числа, потом сказал по другому.. Вообщем посмотрим, сделать нужно хоть как-то. Когда 16ричные числа в массиве вроде легче



--------------------
"Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом
PM MAIL ICQ   Вверх
powerfox
Дата 8.11.2007, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 2
Всего: 97



Цитата(Ripper @  8.11.2007,  22:13 Найти цитируемый пост)
xvr, мне не хватает знаний по си. мы много чего в инсте не проходили и как бы отсюда следует что это использовать нельзя

Если вы многого не проходили, то это не значит, что это нельзя использовать. Максимальное ограничение - конкретная реализация язык (компилятор).
И то, что здесь идёт - не Си, а С++.

Мусье учится на первом курсе?


Цитата(Ripper @  8.11.2007,  22:13 Найти цитируемый пост)
1)template<int Length> что это?

Шаблон, судя по записи. Я с ними плохо знаком, но Length как-то странно здесь смотрится. Обычно указывается просто тип (int в данному случае).


Цитата(Ripper @  8.11.2007,  22:13 Найти цитируемый пост)
2)что такое <<= ? в побитовых операциях ненашел такого

<<= - это оператор. Сдвиг влево и присваивание. Принцип такой же, как и +=, который намного чаще используется.

Цитата(Ripper @  8.11.2007,  22:13 Найти цитируемый пост)
3)что значит прибавить к *this число? Переместить указатель на объект? что получится?

this - укзатель на объект, для которого вызван метод. А *this - сам объект. Обычное разыменовывание.

Цитата(Ripper @  8.11.2007,  22:13 Найти цитируемый пост)
4)в задании сказано использовать массив char-ов а не int-ов

Посмотри базовые сведения о типах в С/С++.




--------------------
user posted image
PM WWW   Вверх
xvr
Дата 8.11.2007, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(Ripper @ 8.11.2007,  21:13)
xvr, мне не хватает знаний по си. мы много чего в инсте не проходили и как бы отсюда следует что это использовать нельзя
И я уже так запарился с этим заданием ужас)
1)template<int Length> что это?

Это шаблон, параметризованный константой (не типом). Константа задает длинну представимых чисел (в единицах по 32 бита)
Цитата

3)что значит прибавить к *this число? Переместить указатель на объект? что получится?
Это значит разыменовать this (получится экземпляр класса, а не указатель), потом к этому экземпляру применить оператор +=
Цитата

4)в задании сказано использовать массив char-ов а не int-ов
Все тоже самое можно сделать и в char'ах, ничего (кроме некоторых констант, задающих длинну элемента массива) не изменится
Цитата

Препод сказал сначала можно в hex виде хранить т.е. в массиве чаров 16ричные числа, потом сказал по другому.. Вообщем посмотрим, сделать нужно хоть как-то. Когда 16ричные числа в массиве вроде легче 
Попробуй написать арифметику с ними (+ - и изменение знака), тогда сразу поймешь, что легче smile

PM MAIL   Вверх
Ripper
Дата 8.11.2007, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lonely soul...
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 30.6.2004
Где: г. Москва

Репутация: нет
Всего: 23



Эээх...
1)Можно без шаблонов? Ну не хочется щас читать ещё одну главу в шилде про шаблоны. наверно можно без них
2)И что значит прибавить к экземляру класса число? Этот оператор не реализован, а что он  в итоге должен делать? 
3)Я вообще не понимаю что этот код делает. 
*this += strtoul(s,0,16); 
memset(body,0,sizeof(body));
Что это за ф-ии? 
4)<<= всмысле сдвиг влево и присваивание.. например *this<<=4? 
"<<" знаю вроде, например 1010 после сдвига 0100 (влево). а какой смысле будет у *this<<=4? 

Я пробую так все это делать:
Код

const int MAX_SIZE = 31;
 
class _hex {
      private:
              int sgn;
              int len;
              char number[MAX_SIZE];
      public:
             _hex();
             _hex(char*);
             _hex(const int);
             
             friend ostream& operator<< (ostream& stream, _hex obj);
             friend istream& operator>> (istream& stream, _hex obj);
};

_hex::_hex() {
     len=0; sgn=0;
     *number='\0';
};


_hex::_hex(char* s) {
     int k;
     switch (*s) { 
            case '+': sgn=0; k=1; break;
            case '-': sgn=1; k=1; break;
            default:  sgn=0; k=0;
     }      
     for (len=0; len<MAX_SIZE&&s[len];len++) 
         number[len]=s[len+k];
     number[len]='\0'; 
      
}

Только незнаю насчет 3 конструктора и ввода >> пока ещё. 


--------------------
"Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом
PM MAIL ICQ   Вверх
Страницы: (4) Все 1 2 [3] 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.2421 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.