1 / 1 / 1
Регистрация: 11.01.2016
Сообщений: 12
|
|
1 | |
преобразовать 40-ка битное бинарное число не используя long long11.01.2016, 16:51. Показов 2594. Ответов 25
Метки преобразование (Все метки)
Доброго времени суток! Прошу помощи, не знаю как выкрутиться. Вся соль в том что long long не могу пользовать, так как CV AVR. Да и пошуршав интернеты оказалось что "экономичней" использовать массив из байтов (char). Собсно само число в двоичном виде я принимаю по 8бит * 5 раз (снимаю состояние ножек порта), потому мне показалось логичным использовать массив. Но! Как мне потом полученные данные перевести в десятичный вид и вывести на LCD. Как можно совершить преобразование без использования переменных более 32бит?
В плане вывести, мне что-то подсказывает, что можно просто string использовать. Как мне из бит получить мое огромное число? Спасибо за внимание!
0
|
11.01.2016, 16:51 | |
Ответы с готовыми решениями:
25
Требуется написать функцию long long pow(long long a, unsigned int p), которая возводит число a в степень p Как преобразовать const char * в long в С++, 0xE0E040BF в long Как преобразовать char[8] к unsigned long long? Преобразовать FILETIME в обычный long long |
1976 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607
|
|
11.01.2016, 21:34 | 2 |
... "в столбик".
Ну, то есть берем байты, от старшего к младшему, и делим их на "10" в столбик. ...чуть позже распишу пример. Добавлено через 1 минуту ЗЫ2: в Java есть класс (не помню точного имени), который использует мультибайтовые вычисления подобным образом. Вы можете поискать теоретически его исходники. Это мультибайтовая арифметика.
0
|
1 / 1 / 1
Регистрация: 11.01.2016
Сообщений: 12
|
|
11.01.2016, 22:02 [ТС] | 3 |
Спасибо за наводку! Сейчас погуглим...
0
|
1976 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607
|
|
11.01.2016, 23:08 | 4 |
нда... с пол-пинка разобраться не получится. Я расчитывал на тип "BigInteger" и его исходник... В методе ToString обычно происходит то что вам требуется. Но если честно, я уже так давно ковырялся в Java, что сразу не понял что в этом методе происходит.
0
|
1 / 1 / 1
Регистрация: 11.01.2016
Сообщений: 12
|
|
11.01.2016, 23:35 [ТС] | 5 |
Ничего себе там коду... Спаси и сохрани!
Если эта задача нерешаема без совсем каких-то мудреных вещей, вы так и скажите. Может быть тогда стоит попытаться эту проблему не решить, а избавиться от нее? Не хотелось бы все переделывать под IAR, я в нем почти не разбираюсь, но если другого выхода нет... Там ведь Long Long есть, может под него есть какие-то встроенные методы для преобразования?
0
|
1976 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607
|
|
11.01.2016, 23:41 | 6 |
Почитайте по поводу типов в доке к вашему CV AVR. Насколько мне помнится, он был, но глючил. Но возможно, для ваших задач его будет достаточно.
0
|
1 / 1 / 1
Регистрация: 11.01.2016
Сообщений: 12
|
||||||
12.01.2016, 00:49 [ТС] | 7 | |||||
В доке только до 32-х бит.
Наткнулся на их оф сайте в разделе "примеры" на вот такое "Example for the 64-bit integer mathematical functions. Requires CodeVisionAVR V3.21 or later." Выходит что с версии 3.21 добавили поддержку 64 битных переменных. В самом примере что-то похожее есть... Может возможно скачать триалку новую, оттуда взять эту библиотеку с 64-битной математикой и себе на 3.12 прикрутить? Попробуем... Собсно, сам пример с оф сайта:
А по какому вообще пути можно было бы пойти, если бы у меня было 32-х битное число? char array >лепим в кучу> string >переводим в десятичное число> long >превращаем в набор цифр> string >выводим цифры> lcd ?
0
|
Модератор
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,524
|
||||||
12.01.2016, 06:18 | 8 | |||||
andrey_k19, пошукай темы с именем "Длинная арифметика" в ветке Си и С++ их было много
насчет реализации, например для x86 мог бы подсказать двоично-десятичное представление числа, там для этого есть специальные ассемблерные команды, для AVR не помню, поддерживает ли евонный ассемблер эту фичу Добавлено через 10 минут стринг лишннее, достаточно в массиве чар хранить в каждой ячейке число от 0 до 9, ну а дальше длинная арифметика вот например одно из решений сложения сложение поразрядное
1
|
1 / 1 / 1
Регистрация: 11.01.2016
Сообщений: 12
|
||||||
13.01.2016, 00:43 [ТС] | 9 | |||||
Спасибо за советы, но чет я так и не понял как мое большое 40ка битное число, хранящееся в виде пяти кусков по 8 бит перевести в одно целое десятичное число.
Начал исследования Atmel Studio 6. Там на long long не ругается. Буду пробовать все туда перенести. Может кто знает как в этой ситуации реализовать преобразование, так чтоб попроще? Как мне эти кусочки по 8 бит накидать в long long? Что-то типа:
И самое главное, как это большое число потом вывести на LCD? Это нужно сначала мой long long в string перевести, чтоб это был набор цифр? Или как?
0
|
Модератор
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,524
|
||||||||||||||||
13.01.2016, 01:41 | 10 | |||||||||||||||
а не пробовал такую штуку,объединение называется
приводить надо
0
|
1 / 1 / 1
Регистрация: 11.01.2016
Сообщений: 12
|
|
13.01.2016, 02:08 [ТС] | 11 |
я имел ввиду не имея доступа к long long, и вывести уже в десятичном виде нужно
а за вот это огромное спасибо! код этой пробной программки неплохо уменьшился, с 1,05кб до 0,7кб
0
|
Модератор
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,524
|
||||||
13.01.2016, 06:31 | 12 | |||||
объединение это такая штука, область памяти которую можешь интерпретировать как угодно
в данном случае это память из 8 байт, которой можно пользоваться как массивом чар, так и длинным инт в отличии от сдвигов где ты выделяешь память под еще одну перемененную вот вводишь байты, а преобразуешь в строку уже длинную инт
0
|
1976 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607
|
|
13.01.2016, 09:39 | 13 |
ValeryS, сложность в том, что в каких-то версиях CV AVR нет нормальной поддержки типа long long. я сталкивался с такой проблемой, но ее получилось быстро решить двумя long'ами, переписал алгоритм. ТС'у в общем случае нужна математика, которая бы посчитала строчку в DEC из массива байт. Типа, вы имеете массив из трех байт: "FF FF FF" а на выходе имеете строчку: "16777215".
0
|
1 / 1 / 1
Регистрация: 11.01.2016
Сообщений: 12
|
|
13.01.2016, 11:17 [ТС] | 14 |
Voland_, вы абсолютно правы. Единственное, в моем случае 5 байт.
0
|
Модератор
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,524
|
|
13.01.2016, 13:19 | 15 |
я ориентируюсь на это
так нужно знать какая математика, и зачем переводить в десятичку, только для вывода на экран? или еще что то делать? в общем неплохо бы ТЗ, что на входе,как обрабатываем, что на выходе
1
|
1 / 1 / 1
Регистрация: 11.01.2016
Сообщений: 12
|
||||||||||||||||
13.01.2016, 22:16 [ТС] | 16 | |||||||||||||||
ValeryS, на входе сигнал подаваемый на один порт, каждая ножка - один бит, пять раз снимаем состояние всех ножек и получаем 5 пачек по одному байту, все это вместе - одно большое число, в двоичном виде. Далее это число, уже в десятичном виде, нужно показать на LCD экранчике. МК атмега 8535.
Добавлено через 1 минуту немного сам уже запутался... Добавлено через 2 часа 25 минут Сделал вот так:
Добавлено через 1 час 54 минуты Накопал вот такое чудо, но оно раза в два больше места чем sprintf занимает , а лимит 8кб вообще на все...
В общем оказалось что заменить атмегу на другую, с памятью поболее, кил на 32/64 если что, можно. Так что главное чтоб заработало. Буту пытаться через sprintf:
Но пока это все вилами по воде, компилятор-то компилит, а что оно на самом деле будет? Мож растеряется где-нить половина знаков или еще что. Затестить на железе получится не раньше следующей недели. Так что, если что отпишу. Мож кому пригодится. Если есть какие советы\критика, тоже рад буду.
0
|
ФедосеевПавел
|
13.01.2016, 22:40
#17
|
Не по теме: Может быть забыть о long long и врукопашную реализовать процедуру деления одного 5-тибайтового на другое путём вычитания (перед этим сделать процедуру вычитания). Это обычное дело для "длинной арифметики" или для вузовских упражнений по ассемблеру.
0
|
1 / 1 / 1
Регистрация: 11.01.2016
Сообщений: 12
|
|
13.01.2016, 23:29 [ТС] | 18 |
ФедосеевПавел, это уже сложная математика, я не силен. А по поводу неинформативности, нужно столько. Иначе не мучался бы изначально с этим.
0
|
Модератор
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,524
|
||||||
14.01.2016, 06:02 | 19 | |||||
andrey_k19, так у тебя есть доступ к long long или нет?
если есть то вот так можешь перевести,
и учти что деление на 10, если аппаратно не реализовано тоже может места занимать
0
|
1 / 1 / 1
Регистрация: 11.01.2016
Сообщений: 12
|
||||||
14.01.2016, 15:36 [ТС] | 20 | |||||
ValeryS, установил atmel studio 6.0, в ней есть поддержка long long. Судя по всему проще под студию все переделать, чем без long long'а обойтись.
Ваше решение добавляет 10кб, а sprintf 4кб с копейками. Но ваше решение интуитивно понятное и по идее точно должно работать, а со sprintf неизвестно, как он отработает long long. Короче в любом случае, на атмегу 8535 не влезет. Значит будем менять... Спасибо за процедурку! Добавлено через 50 минут Мне тут подсказали, попробовать олдскульные методы...
Ну а дальше, если что, то можно будет доплюсовать к каждому 30 или сколько там, по ASCII. Что скажете, господа?
0
|
14.01.2016, 15:36 | |
14.01.2016, 15:36 | |
Помогаю со студенческими работами здесь
20
Создать программу используя условия long long Не понятный undefined reference to `unsigned long long f<unsigned long long, void> как получается число 18446744073709551615 на unsigned long long? Вывести число типа long long int Чем различаются long long и long double? Образовать long число BCDABCDE, используя поразрядные операции Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |