Форум программистов, компьютерный форум CyberForum.ru

Шестнадцатеричные числа в массиве unsigned char - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 31, средняя оценка - 4.87
G1m3rr
15 / 14 / 1
Регистрация: 06.03.2010
Сообщений: 30
24.11.2010, 12:13     Шестнадцатеричные числа в массиве unsigned char #1
Есть массив unsigned char - заполнен, и знаем длину.
В массиве шестнадцатиричное число вида: 51fa9
Нужно реализовать арифметические операции, аналогичные встроенным для целых в C++, и операции сравнения.

Кто поможет тому большое спасибо=)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.11.2010, 12:13     Шестнадцатеричные числа в массиве unsigned char
Посмотрите здесь:

C++ Работа с unsigned char
C++ unsigned char 0....255?!
C++ Совместимость char и unsigned char
C++ const char и unsigned char
C++ Unsigned char to vector
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
24.11.2010, 12:28     Шестнадцатеричные числа в массиве unsigned char #2
Цитата Сообщение от G1m3rr Посмотреть сообщение
Нужно реализовать арифметические операции, аналогичные встроенным для целых в C++, и операции сравнения.
В чем проблема? Арифметика столбиком, как в школе учили. Операции сравнения вообще тупо поэлементное сравнение со старших разрядов числа, если размеры разные, то вообще все очевидно.
G1m3rr
15 / 14 / 1
Регистрация: 06.03.2010
Сообщений: 30
24.11.2010, 12:58  [ТС]     Шестнадцатеричные числа в массиве unsigned char #3
C++
1
2
3
4
5
6
if(((C[i-1]-'0')+(mas[i-1]-'0')+(B[j]-'0'))>15)
            {
                C[i-2]='1';
                C[i-1]=((C[i-1]-'0')+(mas[i-1]-'0')+(B[j]-'0')-16+'0');
                j--;                
            }
C-результат
mas и B - 2 числ, как в условии заменять f на 15, a на 10 итп, а то сумма получается не та которая должна быть.
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
24.11.2010, 13:59     Шестнадцатеричные числа в массиве unsigned char #4
G1m3rr, вы храните цифры как символы, что не есть хорошо. хотя бы потому что ('a' - '0') - не равно 10
G1m3rr
15 / 14 / 1
Регистрация: 06.03.2010
Сообщений: 30
24.11.2010, 14:25  [ТС]     Шестнадцатеричные числа в массиве unsigned char #5
А я вам про что и пытаюсь тут рассказать!
Мне надо именно с этим и разобраться...
отчасти уже разобрался, код на 600 строк, реализовал, сложение с переносом, остались проблемы с числами разной длины.
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
24.11.2010, 14:38     Шестнадцатеричные числа в массиве unsigned char #6
Цитата Сообщение от G1m3rr Посмотреть сообщение
А я вам про что и пытаюсь тут рассказать!
Мне надо именно с этим и разобраться...
отчасти уже разобрался, код на 600 строк, реализовал, сложение с переносом, остались проблемы с числами разной длины.
Это не эффективный подход, отсюда и такой большой код, поэтому либо продолжайте мучиться с символами, либо представьте число как надо. Понадобиться только сделать только две функции для ввода числа и вывода.
Я тут в одной из тем (http://www.cyberforum.ru/cpp-beginne...tml#post877851) писал про сложение длинных чисел различной длины, так вот в среднем одна арифметическая операция занимает 40 строк (быстрое деление больше).

Добавлено через 5 минут
Простите, ссылка на навороченные функции. Вот здесь простейшая реализация сложения http://www.cyberforum.ru/cpp-beginne...tml#post855063
G1m3rr
15 / 14 / 1
Регистрация: 06.03.2010
Сообщений: 30
24.11.2010, 14:40  [ТС]     Шестнадцатеричные числа в массиве unsigned char #7
Спасибо большое позже обязательно посмотрю, сложение допишу в том виде как начал, а остальные функции реализую, как вы посоветовали, хотя это и отход от заданной задачи.
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
24.11.2010, 14:52     Шестнадцатеричные числа в массиве unsigned char #8
G1m3rr, если такое условие, то можно создавать временные массивы и с ними работать. То есть на псевдокоде это будет выглядеть так:
Код
void addition(char *a, char *b, char *result)
{
     // Предполагается что a, b, result содержат именно символы 

     // Создаются новые массивы, которые будут хранить уже преобразованные исходные
     // Работа будет именно с числами, можно воспользоваться динамическим выделением памяти, если есть смысл
     char tmp_a[MAXLEN];     
     char tmp_b[MAXLEN];
     char tmp_res[MAXLEN];

     // Преобразуете числа
     to_num(a, tmp_a);
     to_num(b, tmp_b);

     // Выполняете сложение
     ....

     // Выполняете обратное преобразование
     to_symbols(tmp_res, result);
}
Как более простой вариант, но неверный по своему подходу.
Делаете функцию которая возвращает правильную цифру по символу и работаете с ней. И функцию обратную.
То есть пишете не так:
Цитата Сообщение от G1m3rr Посмотреть сообщение
if(((C[i-1]-'0')+(mas[i-1]-'0')+(B[j]-'0'))>15)
{
C[i-2]='1';
C[i-1]=((C[i-1]-'0')+(mas[i-1]-'0')+(B[j]-'0')-16+'0');
j--;
}
а примерно следующим образом:

C
1
2
3
4
5
6
7
8
char carry = to_num(C[i-1]) + to_num(C[i-1]) + to_num(B[j]);
if(carry > 15)
{
     C[i-2] = to_sym(1);
     C[i-1] = to_sym(carry - 16);
 
     j--;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.11.2010, 19:42     Шестнадцатеричные числа в массиве unsigned char
Еще ссылки по теме:

C++ Unsigned char to string
Типы данных - где нужно использовать char, а где unsigned char? C++
C++ Неверная конверсия из char* в unsigned char*

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
G1m3rr
15 / 14 / 1
Регистрация: 06.03.2010
Сообщений: 30
24.11.2010, 19:42  [ТС]     Шестнадцатеричные числа в массиве unsigned char #9
Помогите плз с конвертацией из int в unsigned char
Вот как конвертировал из unsigned char в int
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
int Hex::convert()
{
    int num=0;
    for(int i=0;i<count;i++)
    {
        int buf=1;
        for(int j=count-i;j>1;j--)
            buf=buf*16;
        if((mas[i]-'0')<10)
            num=num+buf*(mas[i]-'0');
        else if (mas[i]=='a')
            num=num+buf*10;
        else if (mas[i]=='b')
            num=num+buf*11;
        else if (mas[i]=='c')
            num=num+buf*12;
        else if (mas[i]=='d')
            num=num+buf*13;
        else if (mas[i]=='e')
            num=num+buf*14;
        else if (mas[i]=='f')
            num=num+buf*15;
    }
    return num;
}
count - Длина массива
с обратной конвертацией, что-то пока проблемы.
Yandex
Объявления
24.11.2010, 19:42     Шестнадцатеричные числа в массиве unsigned char
Ответ Создать тему
Опции темы

Текущее время: 15:25. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru