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

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

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

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

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

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

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

 
Опции темы

Преобразовать двоичное в двоично-десятичное

Непрочитано 25.06.2018, 08:27  
raptor37
Прописка
 
Регистрация: 07.08.2005
Сообщений: 155
Сказал спасибо: 71
Сказали Спасибо 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
Адрес: Москва СЗАО/МО
Сообщений: 12,274
Сказал спасибо: 11,856
Сказали Спасибо 4,157 раз(а) в 3,175 сообщении(ях)
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.RUN
 
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
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;
d = xx % 10; xx = xx / 10;
c = xx % 10; xx = xx / 10;
b = xx % 10; xx = xx / 10;
a = 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.RUN
 
Регистрация: 24.03.2007
Сообщений: 1,393
Сказал спасибо: 85
Сказали Спасибо 670 раз(а) в 391 сообщении(ях)
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
Адрес: Москва СЗАО/МО
Сообщений: 12,274
Сказал спасибо: 11,856
Сказали Спасибо 4,157 раз(а) в 3,175 сообщении(ях)
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.RUN
 
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,457
Сказал спасибо: 3,225
Сказали Спасибо 3,511 раз(а) в 2,392 сообщении(ях)
ForcePoint на пути к лучшему
По умолчанию Re: Преобразовать двоичное в двоично-десятичное

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

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

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

Последний раз редактировалось makakus; 27.06.2018 в 11:16.
makakus вне форума  
Непрочитано 27.06.2018, 08:29  
raptor37
Прописка
 
Регистрация: 07.08.2005
Сообщений: 155
Сказал спасибо: 71
Сказали Спасибо 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.RUN
 
Аватар для Alex9797
 
Регистрация: 20.08.2010
Адрес: Днепр
Сообщений: 8,548
Сказал спасибо: 5,035
Сказали Спасибо 10,605 раз(а) в 3,594 сообщении(ях)
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, время: 05:22.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.