AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
25.06.2018, 08:27
|
|
Прописка
Регистрация: 07.08.2005
Сообщений: 146
Сказал спасибо: 67
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Преобразовать двоичное в двоично-десятичное
Здравствуйте уважаемые форумчане.
Программирую редко и время от времени возникают детские вопросы((
Есть переменная int x = 1016 (десятичное)
есть переменные char a,b,c,d
как перевести x в двоично-десятичное а именно чтобы:
а = 1; b = 0; с = 1; d = 6
Спасибо.
|
|
|
|
25.06.2018, 09:08
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,247
Сказал спасибо: 11,166
Сказали Спасибо 3,855 раз(а) в 2,926 сообщении(ях)
|
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;
}
Вычитание остатка приведено для экзотического случая целочисленного деления с округлением - сейчас не помню уже, но на каком-то веселом камне столкнулся с таким ![Прикольно](images/smilies/icon_wink3.gif) поведением арифметики, которая обычно для целых чисел про округление не знает.
Ну и для совсем универсального варианта нужно учитывать знак исходного числа и посему добавить после 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
|
|
|
25.06.2018, 10:46
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,443
Сказал спасибо: 99
Сказали Спасибо 315 раз(а) в 231 сообщении(ях)
|
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
|
|
|
25.06.2018, 11:05
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.03.2007
Сообщений: 1,352
Сказал спасибо: 85
Сказали Спасибо 610 раз(а) в 369 сообщении(ях)
|
Re: Преобразовать двоичное в двоично-десятичное
Если речь про быстродействие, то от лишнего деления лучше избавиться (хотя тут от камня зависит).
Типа такого сделать (умножение вместо деления):
xx=x /10;
d=x-xx*10;
x=xx;
xx=x /10;
с=x-xx*10;
x=xx;
и т.д., к следующей цифре...
|
|
|
Сказали "Спасибо" pambaru
|
|
|
25.06.2018, 11:27
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,247
Сказал спасибо: 11,166
Сказали Спасибо 3,855 раз(а) в 2,926 сообщении(ях)
|
Re: Преобразовать двоичное в двоично-десятичное
Godzilla82, каюсь ![Прикольно](images/smilies/icon_wink3.gif) писал ещё не проснувшись.
Там просто нужно объявление для массива bcd отдельной строкой unsigned short int bcd[5]; сделать и тогда все будет правильно…
pambaru, а вот здесь очень многое от архитектуры ALU зависит. Это уже для конкретного варианта нужно смотреть. Да и разница там будет максимум пара десятков тактов для слова.
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
Последний раз редактировалось mike-y-k; 25.06.2018 в 11:34.
|
|
|
|
25.06.2018, 12:40
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 6,923
Сказал спасибо: 2,985
Сказали Спасибо 3,163 раз(а) в 2,147 сообщении(ях)
|
Re: Преобразовать двоичное в двоично-десятичное
Если подойдёт "упакованное BCD" (в каждом байте по 2 десятичных цифры), то есть соответствующая app. note AVR 204 на ассемблере.
__________________
Экзорцист 40-го уровня.
|
|
|
Сказали "Спасибо" ForcePoint
|
|
|
25.06.2018, 13:57
|
|
Гражданин KAZUS.RU
Регистрация: 10.06.2010
Сообщений: 598
Сказал спасибо: 222
Сказали Спасибо 234 раз(а) в 154 сообщении(ях)
|
Re: Преобразовать двоичное в двоично-десятичное
|
|
|
Сказали "Спасибо" DmitriyVDN
|
|
|
25.06.2018, 17:26
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.10.2007
Сообщений: 2,760
Сказал спасибо: 1,105
Сказали Спасибо 1,037 раз(а) в 569 сообщении(ях)
|
Re: Преобразовать двоичное в двоично-десятичное
Как раз передо мной программа, прогнал ваше 3f8 = 1016. 86 циклов АВР.
Последний раз редактировалось makakus; 27.06.2018 в 11:16.
|
|
|
|
27.06.2018, 08:29
|
|
Прописка
Регистрация: 07.08.2005
Сообщений: 146
Сказал спасибо: 67
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
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?
|
|
|
|
27.06.2018, 08:52
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.08.2010
Адрес: Днепр
Сообщений: 8,565
Сказал спасибо: 5,041
Сказали Спасибо 10,615 раз(а) в 3,604 сообщении(ях)
|
Re: Преобразовать двоичное в двоично-десятичное
Сообщение от raptor37
|
вычислять напряжение например по формуле:
U_V = (U_x * 120)/U_12V
|
В данном случае так правильнее. Целочисленные вычисления выполняются быстрее.
|
|
|
Эти 2 пользователя(ей) сказали Спасибо Alex9797 за это сообщение:
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 13:24.
|
|