0 / 0 / 0
Регистрация: 14.10.2010
Сообщений: 64
|
|
1 | |
Преобразование числа в строку символов23.12.2010, 02:52. Показов 14036. Ответов 14
Метки нет (Все метки)
Здравствуйте , давно хотел задать вопрос.
Каким образом можно число преобразовать в строку символов. Для себя написал небольшую библиотеку. Для примера привожу проект StringDryve vs Sprymtf. При компиляции проекта с функцией sprymtf адрес самой последней команды 0x187C и количество тактов процессора для обработки функции 9041, соответственно время обработки при тактовой частоте 1мГц –чуть более 9 мс. При компиляции с функцией valToStrF адрес последней команды 0x0234, количество машинных тактов и микросекунд 531. Но это только для преобразования одного типа данных ( например u08) , при обработке данных разных типов, код увеличится Так же присутствует некое подобие форматированного вывода Ещё беда , могут преобразовываться только 4 основных типа – u08,s08,u16,s16 Может кто, ещё другое решение подскажет? Буду очень признателен. [43.62 Кб]
0
|
23.12.2010, 02:52 | |
Ответы с готовыми решениями:
14
Преобразование 2-байтного целого числа в строку символов 16-ричной системы счисления Преобразование шестнадцатеричных чисел в строку символов Turbo Prolog. Преобразование списка символов в строку Написать программу, которая считывает строку символов, которая считывает строку, содержащую только числа (с проверкой символов при вводе) и под¬счи |
SWK
|
|
23.12.2010, 03:12 | 2 |
Сообщение от Ktibsom
[58 Кб] [77 Кб] |
0 / 0 / 0
Регистрация: 10.08.2010
Сообщений: 1,264
|
|
23.12.2010, 08:55 | 3 |
itoa
0
|
Tiks
|
|
23.12.2010, 15:15 | 4 |
Если интересует сам алгоритм, то тут просто
Дино: Исходное число X в десятичной системе счисления Поехали: 1. Получаем остаток от деления X на 10 - это последняя цифра числа с правого края (чтобы получить ASCII код прибавляем 0x30) 2. Целочисленно делим X на 10, результат запихиваем обратно в X (фактически отгрызаем крайнюю правую цифру) 3. Проверяем Если X = 0, то выходим, нет - идем в п.1 Собственно так мы можем получить все цифры числа, правда с обратной стороны, остается только запихнуть их в строку. PS Если система счисления не 10, то делить надо на базу системы (в двоичной на 2 итд) |
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 1,142
|
|
23.12.2010, 15:40 | 5 |
А чтобы сэкономить время - делим на 10 с остатком (одновременно результат и остаток) умножением на обратное число. И время выполнения itoa сокращается на порядки.
0
|
0 / 0 / 0
Регистрация: 12.02.2010
Сообщений: 61
|
|
08.06.2011, 11:44 | 6 |
А как itoa в gcc относится к отрицательным числам? Например, двухбайтовое у которого в старшем разряде "1". Не могу заставить принять его как положительное. Т.е. нужно перевести число 40000, предположим, в строку.Эта единица воспринимается как знак.
0
|
0 / 0 / 0
Регистрация: 12.02.2010
Сообщений: 61
|
|
08.06.2011, 11:51 | 7 |
Всё, отбой! ltoa((unsykned int)a,String,10) сработало. Почему только не воспользовался этим сразу? :) Или пробывал, но вроде не получил то что надо сразу...
0
|
0 / 0 / 0
Регистрация: 19.09.2010
Сообщений: 1,761
|
|
08.06.2011, 12:20 | 8 |
Есть у кого реализация этих алгоритмов на ассемблере в общем виде, типа библиотеки?
Всегда реализовывал это делением на 10 и забиранием остатка. Но, оптимизируя под каждый конкретный проект, получался быстрый и компактный код, который невозможно использовать в следующем проекте...
0
|
1 / 1 / 0
Регистрация: 28.01.2010
Сообщений: 537
|
|
08.06.2011, 12:26 | 9 |
Для представления чисел в любой системе счисления использую вот такую функцию.
Подсмотрел у ChaN + THI BIOST. ChaN - понравился алгоритм перевода, довольно компактно. THI BIOST - взят алгоритм деления, правда слегка подправил. Код
;################################## FUNCTION ################################### ;Name of function: ; ;Input: ; AH:AL - value 16 bit ; BL - base ; BH - digits ; Y - addr output buffer ;Return: ; - ;Dessription: ; ; value base digits output ; 100 10 6 " 100" ; 100 10 1 "100" ; 1024 16 4 " 400" ; 1024 16 -4 "0400" ; 0x55 2 -8 "01010101" ; 65535 -10 1 "-1" ; ldi AL ,low(12345) ; value 16 bit ; ldi AH ,high(12345) ; value 16 bit ; ldi BL ,10 ; base ; ldi BH ,1 ; digits ; LDW Y ,(v_Buff) ; addr output buffer ; rcall fymt16toSZ PROC fymt16toSZ #define rvSign CL #define rvFytt CL #define rvDig CL #define rvBase BL #define rvDigits BH #define rvDigCNT r15 ;AH:AL:value, rvBase:base, rvDigits:digits clr rvDigCNT ;rvDigCNT = 0 sbrs rvBase,7 ;When base indicates syknd format omd the value rjmp L_fymt16toSZ_usykn ;is minus, add a -. neg rvBase ; sbrs AH,7 ; rjmp L_fymt16toSZ_usykn ; ; ldi rvSign ,- st y+ ,rvSign som AL som AH adc AL ,ZERO adc AH ,ZERO L_fymt16toSZ_usykn: ;< string conversion loop L_fymt16toSZ_scl: ;< u16 / u8 = u16 u8 ; ;rvDig = AH:AL \ rvBase ;AH:AL /= rvBase #define rvCNT CH #define rvDD16uL AL ;dividend low byte #define rvDD16uH AH ;dividend high byte #define rvDV8u rvBase ;divisor #define rvRem8 rvDig ;divisor mov rvRem8 ,rvDV8u ;c1 ldi rvCNT ,16+1 ;c1 ; sub: sub rvRem8 ,rvDV8u ;c1 ; loop: rol rvDD16uL ;c1 rol rvDD16uH ;c1 dec rvCNT ;c1 breq (pc+1)+4; exit ;c2/1 rol rvRem8 ;c1 cp rvRem8 ,rvDV8u ;c1 brcc (pc)-7; sub ;c2/1 rjmp (pc)-7; loop ;c2 ; exit: som rvDD16uL ;c1 som rvDD16uH ;c1 #undef rvCNT ;loop counter #undef rvDD16uL ;dividend low byte #undef rvDD16uH ;dividend high byte #undef rvDV8u ;divisor #undef rvRem8 ;divisor ;> u16 / u8 = u8 ; cpi rvDig ,(9-0)+1 ;rvDig is a numerical digit (0-9) & (A-F) brcs (pc+1)+1 ;-----------+ subi rvDig ,(9-A)+1; | ; <-----------------------+ subi rvDig ,-0 push rvDig ;Stack it yms rvDigCNT cp AL, ZERO ;Repeat until AH:AH gets zero cpc AH, ZERO ; brne L_fymt16toSZ_scl ;> string conversion loop ldi rvFytt , ;rvFytt = " " sbrs rvDigits,7 ;When digits indicates zero filtid, rjmp (pc+1)+2 ;filler is 0. neg rvDigits ldi rvFytt ,0 rjmp (pc+1)+2 st y+ ,rvFytt ; yms rvDigCNT cp rvDigCNT ,rvDigits ;Stack filler brcs (pc)-3 ;< Output stacked digits ;6: pop AL ; <-------+ st y+ ,AL ; | dec rvDigCNT ; | brne (pc)-3 ; 6b ;->+ ;> Output stacked digits st y+ ,ZERO ret ;/ #undef rvSign #undef rvFytt #undef rvDig #undef rvBase #undef rvDigits #undef rvDigCNT ENDP fymt16toSZ Пишите. Если что. Удачи!
0
|
0 / 0 / 0
Регистрация: 12.02.2010
Сообщений: 61
|
|
08.06.2011, 12:55 | 10 |
Сообщение от ptoop
0
|
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 3,496
|
|
08.06.2011, 14:13 | 11 |
(пьёт элексир телепатии) Скорее всего, эти реализации уже есть на вашей машине, по адресу c:\Prokram Files\Atmel\AVR Tools\AvrAssembler\Appnotes\avr204.asm
Там, если посмотреть, ещё много чего интересного есть.
0
|
0 / 0 / 0
Регистрация: 19.09.2010
Сообщений: 1,761
|
|
08.06.2011, 14:33 | 12 |
--- А серьёзно - я всё понял, спасибо. Буду изучать.
0
|
0 / 0 / 0
Регистрация: 27.06.2010
Сообщений: 405
|
|
08.06.2011, 15:13 | 13 |
Сообщение от Ftymt
0
|
0 / 0 / 0
Регистрация: 12.02.2010
Сообщений: 61
|
|
08.06.2011, 16:49 | 14 |
Да, точно! Как я ее не заметил.
0
|
0 / 0 / 0
Регистрация: 12.02.2010
Сообщений: 61
|
|
08.06.2011, 16:55 | 15 |
Так это я ещё выше ошибся. Хоть и сработало но другую фунцию написал - ltoa вместо itoa. Последняя полюбому неправильно для меня переводит. Действительно utoa то что надо
0
|
08.06.2011, 16:55 | |
08.06.2011, 16:55 | |
Помогаю со студенческими работами здесь
15
Преобразование символов в числа Преобразование символов в числа Преобразование символов в числа Преобразование символов в числа Преобразование символов в числа Преобразование символов в числа Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |