Методи и операционни блокове за преобразуване на числа от десетична в двоична бройна система
1. Цел на упражнението:
Целта на упражнението е, работейки с програмните модели на операционните блокове за преобразуване на цели и дробни числа от десетична в двоична бройна система, студентите да добият по-ясна представа за начините за реализиране на съответните методи, а също така да се установи степента на усвояване на микроалгоритмите за преобразуване.
2. Теоретична част:
2.1. Общ метод за преобразуване на числата от една позиционна бройна система в друга.
Постановка на задачата: Да се преобразува число, записано в система с основа q в система с основа p, т.е. да се представи например в следния вид:
АP = аn pn-1 + аn-1pn-2 + аn-2pn-3 + … + а3 p2 + а2 p + а1 +
+ а-1 p-1 + а-2 p-2 + а-3p-3 +… + а-k p-k =
= АЦЧ + АДЧ
Преобразуването на цялата (АЦЧ) и на дробната (АДЧ) част на числото се извършва по различни начини т.е. отделно.
2.1.1. Преобразуване на цели числа – извършва се като AЦЧ се раздели на p и се отдели целочисленото частно A’ и остатъкът, а след това А’ се раздели на p и се отдели целочисленото частно A’’ и остатъкът и т.н. докато се получи частно равно на 0. Получените остатъци са търсените цифри аi като последният остатък е старшата цифра на числото АР.
Доказателство: Допускаме, че числото вече е преобразувано.
АЦЧ/p = аn pn-2+ аn-1pn-3+ аn-2pn-4 +… + а3 p + а2 + а1/p; а1 - остатък
А’/p = аn pn-3+ аn-1pn-4+ аn-2pn-5 +… + а3 + а2/p; а2 - остатък
Делението се извършва в система с основа q, т.е. основата p трябва предварително да се представи в тази система (ако е необходимо). Цифрите а1, а2, … също се поучават в система с основа q и трябва впоследствие да се преобразуват (ако е необходимо).
По-долу в качеството на пример ще бъде показано преобразуването на цели числа от десетичната в осмичната система и обратно. Както вече беше споменато, при това всички действия се извършват в системата, от която се преминава към друга система. За облекчаване на преобразуването от осмичната в десетичната система е показано и съответствието между числата в тези две системи.
| “10’’ | 0 | … | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | … |
| “8’’ | 0 | … | 7 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 20 | … |
| (147)10 ® ( ? )8 | (223)8 ® ( ? )10 | |||||||||||
| 147 | : 8 | 223 | :12 | |||||||||
| -144 | 18 | : 8 | -214 | 16 | :12 | |||||||
| 3 | -16 | 2 | : 8 | 7 | -12 | 1 | :12 | |||||
| а1 | 2 | -0 | 0 | а1 | 4 | -0 | 0 | |||||
| а2 | 2 | а2 | 1 | |||||||||
| а3 | а3 | |||||||||||
| (147)10 ® (223)8 | (223)8® (147)10 | |||||||||||
2.1.2. Преобразуване на дробни числа – извършва се като AДЧ се умножи на p и се отдели дробната част A’ и цялата част, след това A’ се умножи на p и се отдели дробната част A’’ и цялата част и т.н. докато се получи дробна част равна на 0 или докато не се получат толкова на брой разряди, че точността на представяне на числото след преобразуването да бъде същата като тази преди преобразуването. Получените цели части са търсените цифри а-i като първата цяла част е старшата цифра на числото АP.
Доказателство: Допускаме, че числото вече е преобразувано.
АДЧ . p = а-1 + а-2 p-1 + а-3 p-2 +… + а-k p-(k-1) ; a-1 – цяла част
А’ . p = а-2 + а-3 p-1 + … + а-k p-(k-2) ; a-2 – цяла част
………………………………………………….
Умножението се извършва в система с основа q, т.е. основата p трябва предварително да се представи в тази система (ако е необходимо). Цифрите а-1, а-2, … също се получават в система с основа q и трябва впоследствие да се преобразуват (ако е необходимо).
В случай, че при умножението на р не се получава дробна част равна на нула, се изчисляват толкова на брой разряди след запетаята, колкото е необходимо за запазване на точността на представяне. Този брой може да се определи по следната формула:
nР = nq. lg q / lg p,
където nq е броят разряди след запетаята на числото в система с основа q, а nР е минималният брой разряди, които трябва да се получат в процеса на преобразуването.
По-долу в качеството на пример ще бъде показано преобразува-нето на дробни числа от десетичната в осмичната система и обратно.
| (0,6875)10® ( ? )8 | (0,54)8® ( ? )10 | ||||
| 0, | 6875 | 0, | 54 | ||
| х | 8 | х | 12 | ||
| а-1 5, | 5000 | 1, | 30 | ||
| х | 8 | +5, | 4 | ||
| а-2 4, | 0000 | а-1 6¬6, | 70 | ||
| х | 12 | ||||
| (0,6875)10®(0,54)8 | 1, | 60 | |||
| +7, | 0 | ||||
| а-2 8¬10, | 60 | ||||
| х | 12 | ||||
| 1, | 40 | ||||
| +6, | 0 | ||||
| а-3 7¬7, | 40 | ||||
| х | 12 | ||||
| 1, | 00 | ||||
| +4, | 0 | ||||
| а-4 5¬5, | 00 | ||||
| (0,54)8® (0,6875)10 | |||||
2.2. Методи за преобразуване от десетична в двоична система.
2.2.1. Метод за ръчно преобразуване – използва се общият метод, т.е. чрез деление на цялата част и умножение на дробната част на 2.
| (147)10® ( ? )2 | (0,6875)10 ® ( ? )2 | ||||||||||
| 147 | : 2 | 0, | 6875 | ||||||||
| 146 | 73 | : 2 | x | 2 | |||||||
| 1 | 72 | 36 | : 2 | a-1 1, | 3750 | ||||||
| a1 | 1 | 36 | 18 | : 2 | х | 2 | |||||
| a2 | 0 | 18 | 9 | : 2 | a-2 0, | 7500 | |||||
| a3 | 0 | 8 | 4 | : 2 | x | 2 | |||||
| a4 | 1 | 4 | 2 | : 2 | a-3 1, | 5000 | |||||
| a5 | 0 | 2 | 1 | : 2 | x | 2 | |||||
| a6 | 0 | 0 | 0 | a-4 1, | 0000 | ||||||
| a7 | 1 | ||||||||||
| a8 | (0,6875)10 ® (0,1011)2 | ||||||||||
| (147)10® (10010011)2 | |||||||||||
2.2.2. Методи за машинно преобразуване:
а. програмно – използват се специални подпрограми, алгоритмите на които са съставени на базата на показаните по-долу изрази.
За цели десетични числа:
АЦЧ = аn 10n-1 + аn-110n-2 + … + а2 10 + а1=
= (( … ((0 + аn)10 + аn-1)10 + … + а2)10 + а1
За дробни десетични числа:
АДЧ = а-1 10-1 + а-2 10-2 + … + а-(k-1)10-(k-1) + а-k10-k =
= ((…((0 + а-k)/10 + а-(k-1))/10 +…+а-2)/10 + а-1)/10
Цифрите ai на десетичното число, а също и основата на десетичната система се представят в двоичната (използва се код 8421) и всички действия се извършват в тази система. В резултат се получава A в двоичната система.
б. апаратно – десетичното число се представя в десетична двоично – кодирана система с използване на код 8421.
- преобразуване на цели числа – използва се общият метод, т.е. чрез деление на 2 и отделяне на остатъците.
Апаратното деление на 2 става чрез изместване на двоично-десетичния код на десетичното число на един разряд надясно. При това, ако в старшия разряд на дадената тетрада не се прехвърли “1” от съседната й в ляво, то, в резултат на изместването, в тази тетрада действително се получава кодът на разделената на 2 десетична цифра. Например:
| 80 | 40 | 20 | 10 | 8 | 4 | 2 | 1 | |||
| 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 86 |
|
Но, ако след изместването в старшия разряд на дадена тетрада се появи “1”, тя ще получи тегло 8, а не 10/2=5, както би трябвало да бъде. Следователно съдържанието на всяка тетрада, в старшия разряд на която се е появила “1”, трябва да се намалява с 8-5=3. Но това изисква използването на субтрактор, което може да се избегне, ако вместо да се изважда 3 се прибавя 13, т.е. 1101. При това, тъй като в старшия разряд на тетрадата има “1”, а събирането е двоично, то винаги ще възниква пренос с тегло 16. Ако този пренос не бъде отчетен, в крайна сметка се получава корекция 13-16=-3, както и трябва да бъде. Например:
| 80 | 40 | 20 | 10 | 8 | 4 | 2 | 1 | |||
| 1 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 96 |
+
|
Схемата на операционната част на блока за преобразуване на цели десетични числа в двоичната система е показана на фиг.1. В Рх се записва двоично-десетичният код на десетичното число, в Рк се записват кодовете на корекциите, а в Рz след съответния брой цикли се получава двоичният код на числото. Във всеки от циклите се извършват последователно следните микрооперации:
* ИД Рх и ИД Рz;
* ЗРк;
* ПрК Рх и ПрК Рк в å;
* ПК Рх.
Забележка: При корекция = 0 може да се извършва направо ИД.
| (75)10® ( ? )2 | |||||
| Рх | Рz | ||||
| 0111 | 0101 | 0000000 | |||
| ИД1 | 0011 | 1010 | 1000000 | ||
| Кор. | + | 0000 | 1101 | ||
| 0011 | 0111 | ||||
| ИД2 | 0001 | 1011 | 1100000 | ||
| Кор. | + | 0000 | 1101 | ||
| 0001 | 1000 | ||||
| ИД3 | 0000 | 1100 | 0110000 | ||
| Кор. | + | 0000 | 1101 | ||
| 0000 | 1001 | ||||
| ИД4 | 0000 | 0100 | 1011000 | ||
| Кор. | + | 0000 | 0000 | ||
| 0000 | 0100 | ||||
| ИД5 | 0000 | 0010 | 0101100 | ||
| Кор. | + | 0000 | 0000 | ||
| 0000 | 0010 | ||||
| ИД6 | 0000 | 0001 | 0010110 | ||
| Кор. | + | 0000 | 0000 | ||
| 0000 | 0001 | ||||
| ИД7 | 0000 | 0000 | 1001011 | ||
| Цифрова диаграма на блока за преобразуване на цели числа от десетичната в двоичната система | |||||
преобразуване на дробни числа – използва се общият метод, т.е. чрез умножение на 2 и отделяне на целите части.
Апаратното умножение на 2 става чрез изместване на двоично-десетичния код на десетичното число на един разряд наляво, което е равносилно на събиране на две еднакви числа. При това, за да се получи кодът на удвоеното число се налага прибавянето на корекция (+6) към тези тетради, в които след изместването се е получил код на цифра > 9, а също и към тетрадите, в старшия разряд на които преди изместването е имало “1”, т.е. от които при изместването се е получил пренос. С цел да се опрости апаратната реализация на това правило преди изместването се прибавя корекция (+3) към всички тетради, в които има кодове на цифри > 4. Валидността на последното може да бъде показана със следната таблица:
| Преди изместване | След
изместването |
Кор. | Забележка | ||||||||
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
| 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | Корекция |
| 2 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | не е |
| 3 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | необходима |
| 4 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | |
| 5 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | +6 | Тетрада |
| 6 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | +6 | по-голяма |
| 7 | 0 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 0 | +6 | от 9 |
| 8 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | +6 | Пренос |
| 9 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | +6 | Пренос |
Схемата на операционната част на блока за преобразуване на дробни десетични числа в двоичната система е показана на фиг.3. В Рх се записва двоично-десетичният код на десетичното число, в Рк се записват кодовете на корекциите, а в Рz след съответния брой цикли се получава двоичният код на числото. Във всеки от циклите се извършват последователно следните микрооперации:
* ЗРк;
* ПрК Рх и ПрК Рк в å;
* ПК Рх;
* ИЛ Рх и ИЛ Рz.
Забележка: При корекция = 0 може да се извършва направо ИЛ.
Сходни статии:
- Програма за преобразуване на четирибайтови числа в допълнителен код Програма за преобразуване на четирибайтови числа в допълнителен код Зададеното число се разполага в четири последователни клетки от паметта. И тук е прието най-старшият байт да е с най-малък адрес....
- Програма за преобразуване на еднобайтови двоични числа в BCD код Максималната стойност на еднобайтовото число е 255. За да бъде преобразувано в двоично-десетично, може да се постъпи по следния начин. От зададената стойност да се изважда най-напред100, докато се получи...
- Изваждане на BCD числа За изваждане на BCD числа не могат да се използват инструкциите SUB, SBC, SBCI, защото код BCD и двоичният код са съвсем различни неща. Тук ще бъде използван алгоритъм, който...
- Търсене на числа от поредица автор: Веселин Димитров Програмата е създадена с цел намирането на числа от поредица такива, които са по-големи от сбора на всички предхождащи го числа. Програмата позволява да се четат числа...
- Програма за умножение на еднобайтови числа без алгебричен знак Програма за умножение на еднобайтови числа без алгебричен знак Алгоритъм на умножението Нека е дадено множимото 1101 и множителя1001. Алгоритъмът за умножение на десетични и двоични числа е един и...