#1 06.06.09 14:40
[C++] Как осуществить операции над шестнадцатиричными числами?
Для хранения hex чисел создал класс. число хранится как массив char.
Посоветуйте, как наиболее просто и удобно организовать арифметические операции над этими числами?
С плюсом то проблем особо не будет, а вот дальше уже голову сломать можно :)
Offline
#2 06.06.09 17:37
Re: [C++] Как осуществить операции над шестнадцатиричными числами?
А разве так не устроит:
Код: с++:
int a,b; std::cin>>std::hex>>a>>b; std::cout<<std::hex<<a+b<<std::endl; std::cout<<std::hex<<a-b<<std::endl; std::cout<<std::hex<<a*b<<std::endl; std::cout<<std::hex<<a/b<<std::endl; std::cout<<std::hex<<a%b<<std::endl;
Исправлено Revenger (06.06.09 17:38)
Offline
#7 06.06.09 18:22
Re: [C++] Как осуществить операции над шестнадцатиричными числами?
так!)
а если извратиться и зделать так:
ввод: пишем в массив char;
ар. операция: из char пишем в файл, с файла читаем то что написали как cin>>hex>>a, делаем все операции, выводим в файл как cout<<hex<<a, считываем с файла в char.
можно ли это все это убогое извращенени произвести в оперативной памяти?))
Исправлено R0mm (06.06.09 18:27)
Offline
#9 06.06.09 18:50
Re: [C++] Как осуществить операции над шестнадцатиричными числами?
Если простым stdio пользоваться, то можно вроде использовать функции sprintf, sscanf, которые считывают и пишут в строку. Есть специальные спецификаторы для шестнадцатеричных чисел.
Offline
#10 06.06.09 18:50
Re: [C++] Как осуществить операции над шестнадцатиричными числами?
forsake написал(а):
чтобы хранить числа произвольной длинны
а тогда мой вариант всё портит :)
Offline
#11 06.06.09 19:01
#12 06.06.09 19:34
#13 06.06.09 19:41
Re: [C++] Как осуществить операции над шестнадцатиричными числами?
такс, пока что получилось только так:
Код: C++:
#include "stdafx.h" #include "iostream" #include "windows.h" using namespace std; int _tmain(int argc, _TCHAR* argv[]) { int a,b; char c[]="af"; a=strtol(c, NULL, 16); cout <<hex<<a; system("pause"); return 0; }
получили из массива char число.
произвели над ним все требуемые оперции.
как бы теперь это число запихать обратно в char ?! :)
Offline
#14 06.06.09 19:42
#15 06.06.09 19:42
#16 06.06.09 19:43
#17 06.06.09 19:46
#18 06.06.09 19:47
#19 06.06.09 19:52
#20 06.06.09 19:55
#21 06.06.09 19:58
#22 06.06.09 19:59
Re: [C++] Как осуществить операции над шестнадцатиричными числами?
R0mm написал(а):
что подразумевается под
R0mm, для хранения чисел есть ограничения в памяти (кол-во байт под одно число).
Чтобы обойти эти ограничения, будто бы вот так извращаются: хранят числа не в обычном его представлении в битах, а как символы (уже в человеческом представлении). Тогда длину массива под одно число ты задаешь сам. Соответственно ограничения устанавливаешь себе сам. Так вот если тебе надо организовать арифметику над подобными числами, то пользоваться переводом этих чисел в обычные означает испортить весь замысел, т.к. числа округлятся.
Значит тебе надо организовать операции сложения, вычитания, деления и умножения самому. Думать, как эти операции выполняются с использованием лишь имеющихся цифр, не переводя в число в обычном представлении компьютера.
Исправлено Kosh_Mar (06.06.09 20:00)
Offline
#23 06.06.09 20:00
#24 06.06.09 20:07
#25 06.06.09 20:27
Re: [C++] Как осуществить операции над шестнадцатиричными числами?
R0mm написал(а):
каждая из которых является шестнадцатиричной цифрой.
ты цифры от чисел отличаешь? сколько цифр в 16-ричной арифметике? как организовываются правила сложения/вычитания и умножения/деления? вот, что от тебя требуется... как будто ты это все на бумаге рисуешь...
Offline
#26 06.06.09 20:28
Re: [C++] Как осуществить операции над шестнадцатиричными числами?
вай)))))))))))
все всем спасибо я решил проблему!
Код: С++:
#include "stdafx.h"
#include "iostream"
#include "string"
#include "windows.h"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int a;
char c1[]="af";
char c2[256];
a=strtol(c, NULL, 16);
_itoa(a, ca, 16);
cout << ca;//в са теперь 16чное представление а
system("pause");
return 0;
}Offline
#27 06.06.09 20:30
#28 06.06.09 20:31
#29 06.06.09 20:37
#30 06.06.09 21:17
Re: [C++] Как осуществить операции над шестнадцатиричными числами?
другая проблема возникла.
прога слетает при выполнении return res;
Код: C++:
hexn hexn::operator +(hexn &a)//перегрузка + { hexn res; char number[256];//временная переменная int i_a, i_b; a.getNumber(number); i_a=strtol(number, NULL, 16);//преобразовали 16чное чисто в int this->getNumber(number); i_b=strtol(number, NULL, 16);//преобразовали 16чное чисто в int i_a+=i_b;//считаем сумму _itoa(i_a, number, 16);//преобразовываем int в 16чное число res.setNumber(number);//применяем параметр return res;//возвращаем результат };
ничего не пойму :(
вызов:
Код: C++:
hexn a, b, c;//а и б определяются позже ... c=a+b; c.getNumber(ch);
Исправлено R0mm (06.06.09 21:21)
Offline
#31 06.06.09 21:27
#32 06.06.09 21:58
Re: [C++] Как осуществить операции над шестнадцатиричными числами?
Потому что при завершении функции удаляются все локальные переменные.
А при возвращении результата создается копия того, что ты возвращаешь.
По-видимому, при завершении функции вызывается деструктор для res, который удаляет твой number.
А у тебя копия с этим numder хочет вернуться.
Я думаю, в этом проблема.
Offline
#33 06.06.09 22:30
Re: [C++] Как осуществить операции над шестнадцатиричными числами?
Сложение двух чисел в системе счисления с основанием N осуществляется поразрядно от младших разрядов к старшим (“справа налево”, если смотреть на запись числа). Когда сумма данного разряда S не превышает значения N, результат сложения является окончательным. Если же S > N, то происходит перенос в старший (“более левый”) разряд, причем каждая единица переноса уменьшает значение S на величину N.
Для выполнения арифметических операций (сложение, вычитание, умножение, деление) в системе счисления с основанием P необходимо иметь соответствующие таблицы сложения и умножения.
http://inf.1september.ru/article.php?ID=200601902
Исправлено Jaguar (06.06.09 22:32)
Offline
#34 07.06.09 00:40
#35 07.06.09 12:39
Re: [C++] Как осуществить операции над шестнадцатиричными числами?
R0mm написал(а):
убрал delete []number - все заработало
потому что делетом можно килять только динамические данные.
Код::
char * number = new char[256]; .... /* поработали с number */ .... delete number; // или delete[] number;
а char number[256] это статический массив. И кстати не понятно каким макаром он вообще доступен в деструкторе, если в операторе + он определяется как локальный.
Offline
#36 07.06.09 13:00
#37 07.06.09 19:28
#38 07.06.09 22:18
#39 08.06.09 16:36
Re: [C++] Как осуществить операции над шестнадцатиричными числами?
Делал подобные задания несколько раз, едиственный вариант который придумал это как уже сказали выше хранить как строку символов (младшими разрядами вперед в самом деле удобнее)...недавно пришлось досканально изучить побитовые операции и теперь мне кажется можно делать длинную арифметику как просто массивом битов, а не байтов, как в случае с символами.
R0mm, то что в задании задумывалась длинная арифметика можешь не сомневаться, заставят переделывать )
Offline
#40 08.06.09 18:47
#41 09.06.09 01:26
#42 09.06.09 01:27
#43 09.06.09 10:40
Re: [C++] Как осуществить операции над шестнадцатиричными числами?
Лис@ написал(а):
опечатался =)
Нисколько не опечатался. Просто массив байтов это термин физический, а строка символов это термин абстрактный, то есть это то как мы интерпретируем массив байтов. А строка есть ничто иное как массив байтов в том смысле что один символ в ASCI == один байт (или 8 бит) например символ А это ни что иное как байт 01000001
И массив таких байтов и есть строка заканчивающаяся (совсем необязательно) символом конца строки '\0', что так же ничто иное как 00000000, в памяти нашего глубокоуважаемого компьютера.
Исправлено ^$h@''rK# :) (09.06.09 10:49)
Offline
#44 09.06.09 15:46
#45 09.06.09 16:53
Re: [C++] Как осуществить операции над шестнадцатиричными числами?
Jaguar, так я и написал что вижу строку как массив байтов. В чем вопрос то?? да есть типы данных в которых символ занимает больше одного байта, но в любом случае размер строки символов кратен байту, и это массив байтов.
Offline

