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

Поиск:

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


Эксперт
****


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

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



Цитата

Цитата(xvr @  2.11.2007,  19:59 Найти цитируемый пост)
Получение прямого кода из двоичного-дополнительного (или любого другого):

int convert_to_direct_code(int org)

O_o
А зачем??? Это ведь просто "портит" число... Ведь простой оператор минус всё сделает сам...
Если уж и реализовывать в виде int, то использовать арифметические операторы.
Автору темы нужно было реализовать ПРЯМОЕ представление числа, а в компьютере используется ДОПОЛНИТЕЛЬНОЕ. Очевидно, что арифметику над этим ПРЯМЫМ представлением ему придется писать самому, 'простой оператор минус' расчитан на ДОПОЛНИТЕЛЬНОЕ. Но в его случае ему всеравно придется писать арифметику самому, так как у него будет арифметика с числами произвольной длинны (не 32 бита).
Цитата

Цитата(Ripper @  1.11.2007,  17:05 Найти цитируемый пост)
Подскажите, как перевести число которое я передам в конструктор в двоичное, и самое главное - в прямой код как.

Преобразовывать ничего не надо, как уже сказали: число, оно и в Африке число. Просто оно может быть записано по-разному (если уж не понятно, как объясняли выше, то пример - римские и арабские числа).
Ну надо человеку! Что поделать, задание такое smile
Кстати, в его случае имело бы смысл вообще хранить знак отдельно (не в старшем бите).
PM MAIL   Вверх
bsa
Дата 2.11.2007, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Ripper
возможно, ты имеешь в виду, что у тебя нет ограничений на разрядность числа? Тогда действительно проще держать модуль числа и знак отдельным полем.
PM   Вверх
Ripper
Дата 2.11.2007, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lonely soul...
**


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

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



Хорошо, пользователь ввел строку (массив чаров) равную 8AB.  Что должно быть в классе в массиве том? 
Вот число которое в африке число... и неважно в какой оно системе - ну и чего
По мне так как я понял нужно 8АБ представить в двоичном, и записать в массив чаров - это будет прямой код, потом если первая цифра 1 то его инвертировать и прибавить еденицу. Получить дополнительный код. А потом сложение вычитание реализовать
Тока я пока не особо представляю как я это все сделаю, например 1)Разрядная сетка это sizeof(int)*8? 2)допустим два байта 16 бит а число AB в шестадцатеричной. значит 0000 0000 1010 1011 ? А какую тогда цифру вообще проверять, вот 00000000010101011 это записано будет в массиве, но как определить что есть первая. Или наверно нафиг ненужно нули писать. А если ввести AAAAAA то типа переполнение ?
Нет, все равно тупик)))  smile

Добавлено через 4 минуты и 51 секунду
1A - 0001 1010 - что здесь старший бит? [0]001 1010 
A1 - 1010 0001 а здесь [1]010 0001. Т.е. это отрицательное число с модулем 1010 0001 ?


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


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Ripper, ты сначала определись, что именно вводит пользователь. Если он может вводить -8AB и 8AB, то тебе нужно в дополнительный код переводить только число с минусом.
PM   Вверх
Ripper
Дата 2.11.2007, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lonely soul...
**


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

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



Да вроде не сказано в задании как вводить. сказано перегрузить >> <<. Но ведь тут говорят что нет такого понятия как отрицательное число для 8AB. оно отрицательно если первая цифра больше 7. 
Вводить как я понял нужно числа не указывая явно знак.
Тогда что должно быть в массиве в классе, если введены 1А и А1. что здесь будет модулем а что знаком? 



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


I wanna fork()
****


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

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



Цитата(xvr @  2.11.2007,  22:45 Найти цитируемый пост)
Автору темы нужно было реализовать ПРЯМОЕ представление числа, а в компьютере используется ДОПОЛНИТЕЛЬНОЕ

Что значит прямое?
Цитата(xvr @  2.11.2007,  22:45 Найти цитируемый пост)
Очевидно, что арифметику над этим ПРЯМЫМ представлением ему придется писать самому, 'простой оператор минус' расчитан на ДОПОЛНИТЕЛЬНОЕ. Но в его случае ему всеравно придется писать арифметику самому, так как у него будет арифметика с числами произвольной длинны (не 32 бита).

Вспомнилась сказка про белого бычка. Тут уже не раз прозвучало. Что есть 2 варианта работы с числом:
1. Хранить его в виде int. Все операции для такого числа есть. Лишь написать функции для представления его в формате, который требует условие (массив char). Вот и всё. Настраиваем, чтобы cout выводила числа в формате hex, выводим в буфер и читаем по цифре в массив. Задание выполнено.
2. Сами реализуем класс и соответствующие операции (в условии я нашёл только сложение), но нам также нужно преобразование в доп. код. Можно реализовать оператор побитового оператора и сложения с int (для приьавления единицы). Неограниченная длина - делаем вектор char и поле класса, которое хранит разрядность. Ничего такого, чтобы спорить.

Цитата(xvr @  2.11.2007,  22:45 Найти цитируемый пост)
Ну надо человеку! Что поделать, задание такое smile

Задание можно понять немного по разному, а реализовать - так вообще множество вариантов.

Добавлено через 3 минуты и 14 секунд
Что-то лень читать особо. Но что за навороты пошли с модулем и числом по отдельности? Всю жизнь число было "единым". Просто определённые разряды интерпретироваться могут по-разному. И зачем тут понятие модуля, если числа целые. Знаковый разряд и само число (модуль числа). Ввоидится вместе.

Ripper, ты получаешь всё число, но проверяешь старший разрад (чтобы узнать знак числа).


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


I wanna fork()
****


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

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



Цитата(powerfox @  2.11.2007,  23:22 Найти цитируемый пост)
Что значит прямое?

Аа, понял. От вас просят упрощённо.

http://khpi-iip.mipk.kharkiv.edu/library/d...ra/chapter2.htm


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


Эксперт
****


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

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



Цитата(Ripper @ 2.11.2007,  22:05)
Хорошо, пользователь ввел строку (массив чаров) равную 8AB.  Что должно быть в классе в массиве том? 
Вот число которое в африке число... и неважно в какой оно системе - ну и чего
По мне так как я понял нужно 8АБ представить в двоичном, и записать в массив чаров - это будет прямой код, потом если первая цифра 1 то его инвертировать и прибавить еденицу. Получить дополнительный код. А потом сложение вычитание реализовать
Тока я пока не особо представляю как я это все сделаю, например 1)Разрядная сетка это sizeof(int)*8? 2)допустим два байта 16 бит а число AB в шестадцатеричной. значит 0000 0000 1010 1011 ? А какую тогда цифру вообще проверять, вот 00000000010101011 это записано будет в массиве, но как определить что есть первая. Или наверно нафиг ненужно нули писать. А если ввести AAAAAA то типа переполнение ?
Нет, все равно тупик)))  smile

Добавлено @ 22:10
1A - 0001 1010 - что здесь старший бит? [0]001 1010 
A1 - 1010 0001 а здесь [1]010 0001. Т.е. это отрицательное число с модулем 1010 0001 ?

Почему то мне кажется, что от вас хотят получить представление с явным знаком, т.е. или '8AB' (положительное) или '-8AB' (отричательное) и не заниматься никакими интерпретациями никаких старших битов smile Так что в массиве должно лежать 8AB (в бинарном виде или в символьном или еще в каком - неважно), а знак должен лежать ВООБЩЕ отдельно, например так:

Код

char value[size];   // Body of number ('size' is template comstant)
bool sign; // Sign on number, false - positive, true - negative

PM MAIL   Вверх
MAKCim
Дата 4.11.2007, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(xvr @  4.11.2007,  10:17 Найти цитируемый пост)
а знак должен лежать ВООБЩЕ отдельно, например так:

зачем хранить знак?
Ripper
по разрядности числа лимитированы или нет?
если лимитированы (допустим, 32 разряда)
хранить нужно int
а потом в зависимости от представления, которое нужно получить, преобразовывать этот int


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
xvr
Дата 4.11.2007, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(MAKCim @ 4.11.2007,  10:39)
Цитата(xvr @  4.11.2007,  10:17 Найти цитируемый пост)
а знак должен лежать ВООБЩЕ отдельно, например так:

зачем хранить знак?
Ripper
по разрядности числа лимитированы или нет?
если лимитированы (допустим, 32 разряда)
хранить нужно int
а потом в зависимости от представления, которое нужно получить, преобразовывать этот int

При внимательном изучении первого поста можно сделать выводы:
1) Разрядность лимитированна и много больше, чем 32 бита (int не подойдет)
2) Входные данные представленны в ПРЯМОМ коде (читай - с отдельным знаком), при выполнении операций нужно использовать ДОПОЛНИТЕЛЬНЫЙ код - т.е. имеет смысл данные в конструкторе конвертировать в бинарный дополнительный код и именно в таком виде и хранить (в током случае отдельный знак, как я предлагал ранее, не нужен)

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


Lonely soul...
**


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

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



Так. Ещё раз. 16ричное число определяется его длиной (количество цифр в числе, например, до 31) и массивом значений 16ричных цифр (типа char). Число со знаком хранится в прямом коде.

Так что хранить в моем массиве, с одной стороны это массив значений 16ричных чисел. А где хранить прямой код? Тока не говорите что числа везде одни и теже и прямой код один и тотже. Прямой код нужно в двоичном представлении хранить как я понимаю. 


и ещё вопросик
Код

static const 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 "";
}


Как эта ф-ия работает? Извините, мне сложно на си переходить с др. языка, поэтому туго осваиваюсь. return "1111" это что, это разве указатель на тип чар? И как её потом использовать, пользователь вводит строку (массив char-ов) в виде 1FF (т.е. hex число) и мне нужно в другой массив записать это дело в 2 коде... 

Тока я так и не понял что туда писать :(


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


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Зачем тебе двоичный? У тебя в ТЗ про двоичное ничего не сказано. Храни только прямой код и знак, который будешь учитывать при арифметических операциях.
PM   Вверх
Ripper
Дата 5.11.2007, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lonely soul...
**


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

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



И как узнать старший бит? Блин. 
В самом hex числе уже зашит знак. А как тогда производить действия в дополнительном коде? Я незнаю что такое дополнительный код в 16ричном виде. 
пользователь вводит FF+2A
1111 1111 + 00101010. Беремь инвертируем и единицу добавляем 0000 0001 11010101 и складываем. Ну что то в этом роде. Ну разве не так?
Пользователь не должен вводить "+FF" - "-FBA"




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


Эксперт
****


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

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



Цитата(Ripper @ 5.11.2007,  14:02)
И как узнать старший бит? Блин. 
В самом hex числе уже зашит знак. А как тогда производить действия в дополнительном коде? 

Не надо хранить число внутри класса в hex виде - храни в бинарном. В задании сказано только про ввод/вывод числа в hex - это не значит, что и внутри должен быть hex
И старший бит тебе не нужен - арифметика (+/-) делается буз учета старшего бита.
Цитата

Я незнаю что такое дополнительный код в 16ричном виде. 
пользователь вводит FF+2A

В шестнадцатиричном просили прямой код т.е. FF+2A это сумма двух ПОЛОЖИТЕЛЬНЫХ чисел
Цитата

1111 1111 + 00101010. Беремь инвертируем и единицу добавляем 0000 0001 11010101 и складываем. Ну что то в этом роде. Ну разве не так?

Нет, просто складываем 1111 1111 + 00101010 (предполагается, что длинна чисел более 8ми битов, иначе в исходных числах ошибка - FF не представимо в виде 8ми битного числа со знаком)

Цитата

Пользователь не должен вводить "+FF" - "-FBA"

Пользователь МОЖЕТ вводить "+FF", и ДОЛЖЕН вводить "-2A"
PM MAIL   Вверх
Ripper
Дата 6.11.2007, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lonely soul...
**


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

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



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



--------------------
"Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом
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

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


 




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


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

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