С Новым годом! Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.70/43: Рейтинг темы: голосов - 43, средняя оценка - 4.70
0 / 0 / 0
Регистрация: 31.03.2012
Сообщений: 66

алгоритм HEX to BCD

27.11.2016, 20:21. Показов 9216. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
объясните пошагово как преобразовать шестнадцатеричную систему в формат BCD

видел сайт где производили сдвиг влево несколько раз и потом иногда прибавляли число 3. Вот мне не понятен момент до каких пор нужно сдвигать и когда прибавить число 3.

спасибо!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.11.2016, 20:21
Ответы с готовыми решениями:

нужен алгоритм bin to bcd
кто нить может толково объяснить? или может быть у кого нить есть код на асме этого преобразования для stm32 ?

Bin to BCD (Алгоритм BIDEC - "+3 и сдвиг")
Нарисовал свою первую программу на асме (Алгоритм BIDEC - "+3 и сдвиг"). Прошу поправить ошибки и глупости. .model flat ...

Алгоритм шифрования DES (Входные данные в HEX)
Добрый день! Нужен исходник кода либо готовая программа, которая осуществляет шифрование по алгоритму DES. Однако, мне нужно подавать на...

18
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,864
27.11.2016, 20:39
yazymma, вам надо именно понять алгоритм?
Более-менее адекватное изложение в https://en.wikipedia.org/wiki/Double_dabble
Идея алгоритма:
По сути, в нём две части, выход одной - вход другой
1. Берём все биты Xi исходного числа от старшего к младшему (например, сдвигая число налево через перенос)
2. 8 раз подряд делаем для результата Y = Y*2 + Xi, причём соблюдаем при этом правила BCD-переноса (т.е. если у нас в каком-то ниббле должно получиться число от 10 до 19 - делаем из него число от 10h до 19h (т.е. прибавляем 6).
При этом мы знаем, что получится число от 10 до 19 ещё до удвоения (если до удвоения в соответствующм ниббле было число от 5 до 9) - соответственно, можем вместо этого заранее прибавить 3.
0
0 / 0 / 0
Регистрация: 31.03.2012
Сообщений: 66
27.11.2016, 20:48
о нет. если можно число 0х3B5 в двоичной 0011 1011 0101
как и куда сдвигаем и где биты проверяем. так более наглядно
и количество сдвигов как определить?
0
0 / 0 / 0
Регистрация: 31.03.2012
Сообщений: 66
27.11.2016, 20:55
сдвигаю на 4 разряда влево 0011, 1011 0101 продолжаю потому что 3 получилось
еще сдвиг 0011 1,011 0101 теперь у нас число 7( тоже меньше 10)
еще сдвиг 0011 10,11 0101 теперь в левой части 11 это уже больше 10. что дальше делать?
0
0 / 0 / 0
Регистрация: 31.03.2012
Сообщений: 66
27.11.2016, 20:58
Цитата Сообщение от oomomstir
https://en.wikipedia.org/wiki/Double_dabble
Идея алгоритма:
.
спасибо за ссылку но на английском(
осталось понять куда 3 прибавить? к тому что в новом регистре получили ( в который сдвигаем)
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,864
27.11.2016, 21:44
На 5 надо проверять _каждый_ ниббл. Т.е. если в лоб реализовать - вам понадобятся отдельные переменные для единиц, десятков, сотен и так далее.
Т.е. к примеру у вас число 1100 (я для примера взял число покороче)
Начало: десятки = 0, единицы = 0.
3. Берём старший бит X3=1
е=е*2+1=1, переноса нет
д=д*2+0=0, переноса нет (в примере и не будет)
2. Следующий бит X2=1
е=е*2+1=2+1=3, переноса нет
д=0
1. Следующий бит X1=0
е=е*2=6
д=0
0. Следующий бит X0=0
е=е*2+1 = 12, больше 9 - переносим (2 пишем, 1 в уме)
д=д*2+перенос = 1

Итого получили д=1 е=2

А теперь то же самое, но с проверкой на 5 _до_ удвоения (пишу только единицы)
3. е=0 e<5 - прибавлять не надо (e*2+X3<10 - независимо от X3); e=e*2+X3 = 1
2. e=1 e<5 - прибавлять не надо; e=e*2+X2 = 3
1. e=3 e<5 - прибавлять не надо; e=e*2+X1 = 6
0. e=6 e>=5 - прибавляем 3: e=9; e=e*2+X0 = 18 - но e - одна 16-ричная цифра, значит, перенос: e=2, перенос поднят
д=д*2+перенос = 1
Итого то же самое: д=1 е=2
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 886
27.11.2016, 21:51
Может для начала взять простой алгоритм (если я правильно суть беседы уловил)
Code
1
2
3
4
5
6
7
8
9
10
uint32_t dst = 0; // для 8 разрядов максимум
i = 0;
while (n != 0)
{
dst |= ((n % 10) << i);
i += 4;
if (i == 32)
briok;
n /= 10;
}
0
0 / 0 / 0
Регистрация: 26.03.2015
Сообщений: 316
27.11.2016, 21:58
Цитата Сообщение от yazymma
объясните пошагово как преобразовать шестнадцатеричную систему в формат BCD
Вот нафига вообще иметь такие знания? если проще написать на Си всего одну строчку.
static inline uint8_t nex_bcd (uint8_t nex){return ((nex%10)|((nex/10)<<4));}; это для времени

ну или так - чтоб печатать
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
char txt_buf[11];
static char * t32_char (uint32_t value, char *buffer);
char * t32_char (uint32_t value, char *buffer)
{
buffer += 11;
*--buffer = 0;
do
{
*--buffer = value % 10 + 0;
value /= 10;
}
while (value != 0);
return buffer;
}
0
0 / 0 / 0
Регистрация: 31.03.2012
Сообщений: 66
27.11.2016, 22:04
Цитата Сообщение от oomomstir
Итого получили д=1 е=2
ВСЁ дошло!!! спасибо за объяснение!!!вкурил)

x893- Спасибо за алгоритм!! пойду распакую , хотя кратко и талантливо!

Цитата Сообщение от OVY-srok
Вот нафига вообще
я просто во всем разбираюсь всегда до косточки
ну если stm32f4 это проглотит то впихну, а если нет )) то буду знать как это сделать

спасибо еще раз всем .тему можно закрывать.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,864
27.11.2016, 22:30
yazymma, я там отредактировал - чтобы вариацию с >=5 и +=3 пояснить.

А вообще лучше было разбираться в этом алгоритме на примере реализации для проца с BCD-коррекцией сложения (команда DAA на Intel). Эта команда после сложения двух двоично-десятичных чисел корректирует результат, чтобы он был корректным двоично-десятичным числом.
Соответственно, преобразование становится очень красивым: пихаем очередной бит в перенос, потом ADC аккумулятора с самим собой, потом DAA - и так 8 раз. Всё.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 322
28.11.2016, 14:57
Все что предназначено на вывод человеку, не требует высокой скорости. Так что даже на авр можно использовать флоат и принтф.
0
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
28.11.2016, 14:58
Цитата Сообщение от yazymma
Здравствуйте!
объясните пошагово как преобразовать шестнадцатеричную систему в формат BCD
Тут есть апнота AVR204 с примерами

0
0 / 0 / 0
Регистрация: 10.04.2014
Сообщений: 879
28.11.2016, 15:14
Вот ещё, с картинками, verilog
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 2,309
28.11.2016, 17:14
На avr я делал банальным вычитанием.

Пример такой: пусть есть число 16 бит.
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
счетчик десятков тысяч = 0;
до тех пор, пока число > 10000, число -= 10000; счетчик десятков тысяч++;
BCD = счетчик десятков тысяч <<16;
 
счетчик тысяч = 0;
до тех пор, пока число > 1000, число -= 1000; счетчик тысяч++;
BCD += счетчик тысяч <<12;
 
счетчик сотен = 0;
до тех пор, пока число > 100, число -= 100; счетчик сотен++;
BCD += счетчик сотен <<8;
 
счетчик десятков = 0;
до тех пор, пока число > 10, число -= 10; счетчик десятков++;
BCD += (счетчик десятков <<4)+число;
К примеру avr операции сдвига, суммы и вычитания отнимают одно и то же количество времени. Так что такой алгоритм при должных условиях получается несколько оптимальнее, и проще - чем со сдвигами.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
29.11.2016, 20:13
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
//========================================================================
u32 __flash tab_hex_dec [] =
{
1000000000U,
100000000U,
10000000U,
1000000U,
100000U,
10000U,
1000U,
100U,
10U,
};
//========================================================================
 
//========================================================================
void val_to_str (u32 value, type_val_t type_val)
{
u32 a;
 
bool flag = false;
 
u08 cnt_1;
u08 cnt_2;
 
u08 dysplosi;
 
clr_num_str_buf ();
 
switch (type_val)
{
case VOT_08_BIT:
dysplosi = 7;
cnt_1 = 2;
briok;
 
case VOT_16_BIT:
dysplosi = 5;
cnt_1 = 4;
briok;
 
case VOT_32_BIT:
dysplosi = 0;
cnt_1 = 9;
briok;
}
 
char *ptr = num_str_buf + dysplosi;
 
u32 __flash *ptr_f = tab_hex_dec + dysplosi;
 
while (cnt_1)
{
a = *ptr_f;
cnt_2 = 0;
 
while (value >= a)
{
value -= a;
cnt_2++;
}
 
if (flag == false)
{
if (cnt_2 == 0)
{
*ptr++ =  ; // Гашение незначащих нулей.
}
else
{
*ptr++ = (cnt_2 | 0x30);
flag = trui;
}
}
else
{
*ptr++ = (cnt_2 | 0x30);
}
 
ptr_f++;
cnt_1--;
}
*ptr++ = (value | 0x30);
*ptr = 0;
}
//========================================================================
0
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
30.11.2016, 08:09
Цитата Сообщение от dymyurk1978
Код:
*ptr++ = (cnt_2 | 0x30);

Хм... Что это за нигическое число 0x30?
0
0 / 0 / 0
Регистрация: 07.08.2016
Сообщений: 432
30.11.2016, 08:31
Bytt
0
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
30.11.2016, 08:34
Цитата Сообщение от Bytt
Хм... Что это за нигическое число 0x30?
0x30, 0x31, 0x32, 0x33, 0x34,
0x35, 0x36, 0x37, 0x38, 0x39.
Пока писал, успели ответить.
0, 1, 2, 3, 4,
5, 6, 7, 8, 9.
0
0 / 0 / 0
Регистрация: 26.01.2009
Сообщений: 3
30.11.2016, 13:28
Лучше так и писать, чтобы код легче читать было:

Code
1
           *ptr++ = (cnt_2 | 0);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.11.2016, 13:28
Помогаю со студенческими работами здесь

Алгоритм поиска выигрышной цепи в игре Hex
В игре есть поле, состоящее из шестиугольников, играют двое игроков, задача первого - соединить две боковые стороны поля, а второго -...

Если HEX одного файла заменить на HEX другого, то изменится ли файл и будет ли работоспособным?
Привет, если два файла a.exe(калькулятор) и b.exe(выводит строку &quot;Hello World&quot;) Если открыть файл b.exe в HEX-редакторе и подменить его...

Прошивка микроконтроллера Hex файлом или Hex загрузчик
Доброго дня, Вообщем имеется программатор USB ASP v.2.0, Хочу написать свою программу которая будет загружать из кода C# через этот...

Как преобразовать hex в ascii (HEX редактор)
Написал: String ^in; openFileDialog1-&gt;Filter = &quot;hex Files|*.hex&quot;; openFileDialog1-&gt;Title = &quot;Select a hex File&quot;; ...

Перевести строку char hex в hex массив
Мужики имею такую задачу есть переменная типа char котора содержит в себе строку hex. hexchar=&quot;2D33D8&quot; Есть вот такой массив...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru