Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR...

 
Опции темы
Непрочитано 25.06.2018, 08:27  
raptor37
Прописка
 
Регистрация: 07.08.2005
Сообщений: 146
Сказал спасибо: 67
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
raptor37 на пути к лучшему
По умолчанию Преобразовать двоичное в двоично-десятичное

Здравствуйте уважаемые форумчане.
Программирую редко и время от времени возникают детские вопросы((
Есть переменная int x = 1016 (десятичное)
есть переменные char a,b,c,d
как перевести x в двоично-десятичное а именно чтобы:
а = 1; b = 0; с = 1; d = 6
Спасибо.
Реклама:
raptor37 вне форума  
Непрочитано 25.06.2018, 09:08  
mike-y-k
Модератор
 
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,247
Сказал спасибо: 11,166
Сказали Спасибо 3,855 раз(а) в 2,926 сообщении(ях)
mike-y-k на пути к лучшему
По умолчанию Re: Преобразовать двоичное в двоично-десятичное

int a,b,c,d,xx;
int x=1016;

xx=x;
d=xx%10;
xx=(xx-d)/10;
c=xx%10;
xx=(xx-c)/10;
b=xx%10;
xx=(xx-b)/10;
a=xx%10;
xx=(xx-a)/10;

Решение приведено не для конкретного числа, а для общего случая.
Оптимальнее всего в таком случае использовать массив с длиной, равной максимальной разрядности десятичного числа для разрядности исходного числа.
// вариант для 16 битного целого
int xx,i,bcd[5];
int x=1016;

xx=x;
for (i=sizeof(bcd)-1;i›=0;i-- ) {
bcd[i]=xx%10;
xx=(xx-bcd[i])/10;
}
Вычитание остатка приведено для экзотического случая целочисленного деления с округлением - сейчас не помню уже, но на каком-то веселом камне столкнулся с таким поведением арифметики, которая обычно для целых чисел про округление не знает.

Ну и для совсем универсального варианта нужно учитывать знак исходного числа и посему добавить после xx=x; строку if(xx‹0) {xx=0-xx} для получения абсолютного значения. Или заменить ее на xx=x‹0 ? 0-x: x ;

Как-то так
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…

Последний раз редактировалось mike-y-k; 25.06.2018 в 09:49.
mike-y-k вне форума  
Сказали "Спасибо" mike-y-k
raptor37 (25.06.2018)
Непрочитано 25.06.2018, 10:46  
Godzilla82
Почётный гражданин KAZUS.RU
 
Регистрация: 29.10.2006
Сообщений: 1,443
Сказал спасибо: 99
Сказали Спасибо 315 раз(а) в 231 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: Преобразовать двоичное в двоично-десятичное

Сообщение от mike-y-k Посмотреть сообщение
int a,b,c,d,xx;
int x=1016;

xx=x;
d=xx%10;
xx=(xx-d)/10;
c=xx%10;
xx=(xx-c)/10;
b=xx%10;
xx=(xx-b)/10;
a=xx%10;
xx=(xx-a)/10;
Можно немного упростить:

PHP код:

xx 
x;
xx 10xx xx 10;
xx 10xx xx 10;
xx 10xx xx 10;
xx
Сообщение от mike-y-k Посмотреть сообщение

// вариант для 16 битного целого
int xx,i,bcd[5];
int x=1016;

xx=x;
for (i=sizeof(bcd)-1;i›=0;i-- ) {
bcd[i]=xx%10;
xx=(xx-bcd[i])/10;
}
sizeof(bcd) равно 10, а надо 5.

P.S. В плане строчек на СИ - красиво. Но по быстродействию - раз в 20 медленнее.
Godzilla82 вне форума  
Сказали "Спасибо" Godzilla82
raptor37 (25.06.2018)
Непрочитано 25.06.2018, 11:05  
pambaru
Почётный гражданин KAZUS.RU
 
Регистрация: 24.03.2007
Сообщений: 1,352
Сказал спасибо: 85
Сказали Спасибо 610 раз(а) в 369 сообщении(ях)
pambaru на пути к лучшему
По умолчанию Re: Преобразовать двоичное в двоично-десятичное

Если речь про быстродействие, то от лишнего деления лучше избавиться (хотя тут от камня зависит).
Типа такого сделать (умножение вместо деления):
xx=x /10;
d=x-xx*10;
x=xx;

xx=x /10;
с=x-xx*10;
x=xx;

и т.д., к следующей цифре...
pambaru вне форума  
Сказали "Спасибо" pambaru
raptor37 (25.06.2018)
Непрочитано 25.06.2018, 11:27  
mike-y-k
Модератор
 
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,247
Сказал спасибо: 11,166
Сказали Спасибо 3,855 раз(а) в 2,926 сообщении(ях)
mike-y-k на пути к лучшему
По умолчанию Re: Преобразовать двоичное в двоично-десятичное

Godzilla82, каюсь писал ещё не проснувшись.
Там просто нужно объявление для массива bcd отдельной строкой unsigned short int bcd[5]; сделать и тогда все будет правильно…

pambaru, а вот здесь очень многое от архитектуры ALU зависит. Это уже для конкретного варианта нужно смотреть. Да и разница там будет максимум пара десятков тактов для слова.
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…

Последний раз редактировалось mike-y-k; 25.06.2018 в 11:34.
mike-y-k вне форума  
Непрочитано 25.06.2018, 12:40  
ForcePoint
Почётный гражданин KAZUS.RU
 
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 6,923
Сказал спасибо: 2,985
Сказали Спасибо 3,163 раз(а) в 2,147 сообщении(ях)
ForcePoint на пути к лучшему
По умолчанию Re: Преобразовать двоичное в двоично-десятичное

Если подойдёт "упакованное BCD" (в каждом байте по 2 десятичных цифры), то есть соответствующая app. note AVR 204 на ассемблере.
__________________
Экзорцист 40-го уровня.
ForcePoint на форуме  
Сказали "Спасибо" ForcePoint
mike-y-k (25.06.2018)
Непрочитано 25.06.2018, 13:57  
DmitriyVDN
Гражданин KAZUS.RU
 
Регистрация: 10.06.2010
Сообщений: 598
Сказал спасибо: 222
Сказали Спасибо 234 раз(а) в 154 сообщении(ях)
DmitriyVDN на пути к лучшему
По умолчанию Re: Преобразовать двоичное в двоично-десятичное

Преобразуем в строку целые числа
DmitriyVDN вне форума  
Сказали "Спасибо" DmitriyVDN
mike-y-k (25.06.2018)
Непрочитано 25.06.2018, 17:26  
makakus
Почётный гражданин KAZUS.RU
 
Регистрация: 08.10.2007
Сообщений: 2,760
Сказал спасибо: 1,105
Сказали Спасибо 1,037 раз(а) в 569 сообщении(ях)
makakus на пути к лучшему
По умолчанию Re: Преобразовать двоичное в двоично-десятичное

Как раз передо мной программа, прогнал ваше 3f8 = 1016. 86 циклов АВР.

Последний раз редактировалось makakus; 27.06.2018 в 11:16.
makakus вне форума  
Непрочитано 27.06.2018, 08:29  
raptor37
Прописка
 
Регистрация: 07.08.2005
Сообщений: 146
Сказал спасибо: 67
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
raptor37 на пути к лучшему
По умолчанию Re: Преобразовать двоичное в двоично-десятичное

Делаю простой вольтметр на atmega168.
Измеряемое напряжение через резисторный делитель подаётся на АЦП 12 бит.
Есть переменная int U_12V - это значение АЦП при входном напряжении ровно 12 вольт (значение этой переменной примерно 700);
Есть переменная int U_x - это значение АЦП в момент времени когда происходит замер напряжения (может меняться от 0 ... 1023);
И последняя переменная int U_V - это вычисленное значение напряжения в вольтах по формуле:
U_V = (U_x * 12)/U_12V
- так работает и показывает целое значение напряжения в любой момент времени.
Но мне хотелось бы чтобы ещё показывало десятые доли измеренного напряжения.
Как правильнее - использовать переменные U_V, U_x типа long?
и вычислять напряжение например по формуле:
U_V = (U_x * 120)/U_12V;
где младшая цифра U_V- десятые доли вольт.
Или правильнее использовать float?
raptor37 вне форума  
Непрочитано 27.06.2018, 08:52  
Alex9797
Почётный гражданин KAZUS.RU
 
Аватар для Alex9797
 
Регистрация: 20.08.2010
Адрес: Днепр
Сообщений: 8,565
Сказал спасибо: 5,041
Сказали Спасибо 10,615 раз(а) в 3,604 сообщении(ях)
Alex9797 на пути к лучшему
По умолчанию Re: Преобразовать двоичное в двоично-десятичное

Сообщение от raptor37 Посмотреть сообщение
вычислять напряжение например по формуле:
U_V = (U_x * 120)/U_12V
В данном случае так правильнее. Целочисленные вычисления выполняются быстрее.
Alex9797 вне форума  
Эти 2 пользователя(ей) сказали Спасибо Alex9797 за это сообщение:
mike-y-k (27.06.2018), raptor37 (27.06.2018)
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как преобразовать из двоичного в десять polimer Микроконтроллеры, АЦП, память и т.д 4 21.03.2006 23:23


Часовой пояс GMT +4, время: 13:24.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot