Официальный сайт студ.городка НГТУ
Программирование и БД » [C++] Как осуществить операции над шестнадцатиричными числами? 

#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

#3  06.06.09 17:39

Re: [C++] Как осуществить операции над шестнадцатиричными числами?

фишка в том что по заданию

R0mm написал(а):

число хранится как массив char

Offline

#4  06.06.09 17:41

Re: [C++] Как осуществить операции над шестнадцатиричными числами?

R0mm, господи, кто-же над вами так поиздевался?

Offline

#5  06.06.09 17:42

Re: [C++] Как осуществить операции над шестнадцатиричными числами?

как вариант умножение на n-это n раз выполнить сложение))

Offline

#6  06.06.09 18:14

Re: [C++] Как осуществить операции над шестнадцатиричными числами?

Revenger, ))
forsake, :(

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

#8  06.06.09 18:49

Re: [C++] Как осуществить операции над шестнадцатиричными числами?

R0mm, по идее задание такое дано для того чтобы хранить числа произвольной длинны, большие чем все стандартные типы?

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

Re: [C++] Как осуществить операции над шестнадцатиричными числами?

R0mm, так тебе длинную арифметику для шестнадцатеричной СС сделать нужно?
А если так как ты хотел, то  через строковые потоки - читай из него, пиши - как из cout

Offline

#12  06.06.09 19:34

Re: [C++] Как осуществить операции над шестнадцатиричными числами?

Revenger, то есть?
Вообще нужно перегрузить операции +,-,*,/

Offline

#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

Re: [C++] Как осуществить операции над шестнадцатиричными числами?

R0mm, можешь написать как звучит задание?

Offline

#15  06.06.09 19:42

Re: [C++] Как осуществить операции над шестнадцатиричными числами?

cout'ом можно записать в строку?

Offline

#16  06.06.09 19:43

Re: [C++] Как осуществить операции над шестнадцатиричными числами?

forsake, Реализовать класс Hex для работы с беззнаковыми целыми шестнадцатиричными числами,
    используя для представления числа массив типа unsigned char каждая из которых
    является шестнадцатиричной цифрой.

Offline

#17  06.06.09 19:46

Re: [C++] Как осуществить операции над шестнадцатиричными числами?

R0mm написал(а):

Вообще нужно перегрузить операции +,-,*,/

Offline

#18  06.06.09 19:47

Re: [C++] Как осуществить операции над шестнадцатиричными числами?

да всяко длинночисленная арифметика подразумевается, иначе небыло бы такого представление в массиве char

Offline

#19  06.06.09 19:52

Re: [C++] Как осуществить операции над шестнадцатиричными числами?

forsake, что подразумевается под

forsake написал(а):

длинночисленная арифметика

?!

Offline

#20  06.06.09 19:55

Re: [C++] Как осуществить операции над шестнадцатиричными числами?

ну как. вот допустим long максимум 4млрд. А надо сложить число 9999999999999999999999999999999999999999 с 1111111111111111111111111111111111111111. Вот.

Offline

#21  06.06.09 19:58

Re: [C++] Как осуществить операции над шестнадцатиричными числами?

forsake, нене. цель такого представления - вы**ать мозги студенту и не более)

R0mm написал(а):

cout'ом можно записать в строку?

как преобразовать тип string в char?

Offline

#22  06.06.09 19:59

Re: [C++] Как осуществить операции над шестнадцатиричными числами?

R0mm написал(а):

что подразумевается под

R0mm, для хранения чисел есть ограничения в памяти (кол-во байт под одно число).
Чтобы обойти эти ограничения, будто бы вот так извращаются: хранят числа не в обычном его представлении в битах, а как символы (уже в человеческом представлении). Тогда длину массива под одно число ты задаешь сам. Соответственно ограничения устанавливаешь себе сам. Так вот если тебе надо организовать арифметику над подобными числами, то пользоваться переводом этих чисел в обычные означает испортить весь замысел, т.к. числа округлятся.

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

Исправлено Kosh_Mar (06.06.09 20:00)

Offline

#23  06.06.09 20:00

Re: [C++] Как осуществить операции над шестнадцатиричными числами?

R0mm, когда я делал делал такое, тока с двоичными числами, делал так же как ты. В итоге препод выипал мозг мне и все пришлось переделывать нормально.

Offline

#24  06.06.09 20:07

Re: [C++] Как осуществить операции над шестнадцатиричными числами?

forsake, Kosh_Mar, цель сего задания НЕ

forsake написал(а):

длинночисленная арифметика

а "чтобы работало"

помогите cout'ом записать в строку)

Offline

#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

Re: [C++] Как осуществить операции над шестнадцатиричными числами?

Jaguar написал(а):

ты цифры от чисел отличаешь?

o_O

Offline

#28  06.06.09 20:31

Re: [C++] Как осуществить операции над шестнадцатиричными числами?

Mozg_RUS, мозг где ты раньше был) я весь гугл перерыл) только нашел и ты написал)

Offline

#29  06.06.09 20:37

Re: [C++] Как осуществить операции над шестнадцатиричными числами?

Mozg_RUS, на этот случай скрещу пальцы :)

Offline

#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

Re: [C++] Как осуществить операции над шестнадцатиричными числами?

хм..
проблема тут:

Код: C++:

hexn::~hexn(void)//деструктор
{
	delete []number;//удаляем из памяти наше число
	ourCount--;
};

где number[256] - поле класса.
убрал delete []number - все заработало
почему?! :)

Offline

#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

Re: [C++] Как осуществить операции над шестнадцатиричными числами?

Jaguar, спасибо это будет план Б)

Offline

#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

Re: [C++] Как осуществить операции над шестнадцатиричными числами?

Смайлек, спасиб за инфу!
в деструкторе он доступер потому что это поле класса! :)
мой косяк - назвал так же переменную :(

Offline

#37  07.06.09 19:28

Re: [C++] Как осуществить операции над шестнадцатиричными числами?

R0mm, и еще, с числами удобнее работать если хранить их младшими разрядами вперед.

Offline

#38  07.06.09 22:18

Re: [C++] Как осуществить операции над шестнадцатиричными числами?

forsake, логично)

Offline

#39  08.06.09 16:36

Re: [C++] Как осуществить операции над шестнадцатиричными числами?

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

R0mm,  то что в задании задумывалась длинная арифметика можешь не сомневаться, заставят переделывать )

Offline

#40  08.06.09 18:47

Я
Профиль

Re: [C++] Как осуществить операции над шестнадцатиричными числами?

Автор, читай про реализацию работы с большими числами. В любой системе счисления алгоритм будет практически одинаков.

Offline

#41  09.06.09 01:26

Re: [C++] Как осуществить операции над шестнадцатиричными числами?

ну епт, алгоритм - это ли не тупое сложение столбиком с переносом в старший разряд?

Offline

#42  09.06.09 01:27

Re: [C++] Как осуществить операции над шестнадцатиричными числами?

^$h@\'\'rK# :) написал(а):

хранить как строку символов

массив байтов и строка символов немного разные вещи)) опечатался =)

Offline

#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

Re: [C++] Как осуществить операции над шестнадцатиричными числами?

^$h@''rK# :), а как быть с многобайтными строками символов? т.ч. более правильно тут понимать все же

Лис@ написал(а):

массив байтов

Offline

#45  09.06.09 16:53

Re: [C++] Как осуществить операции над шестнадцатиричными числами?

Jaguar, так я и написал что вижу строку как массив байтов. В чем вопрос то?? да есть типы данных в которых символ занимает больше одного байта, но в любом случае размер строки символов кратен байту, и это массив байтов.

Offline

Программирование и БД » [C++] Как осуществить операции над шестнадцатиричными числами? 

ФутЕр:)

© Hostel Web Group, 2002-2025.   Сообщить об ошибке

Сгенерировано за 0.090 сек.
Выполнено 14 запросов.