упражнение №1

Бройни системи

 

Бройната система е метод за представяне на произволно число последством ограничен набор от символи наречени цифри. Съществуват два вида бройни системи

Непозиционна бройна система

Непозиционната бройна система е тази, при която стойността на цифрата не зависи от нейното място в поредицата. Такива бройни системи са Римската и Гръцката.

Позиционна бройна система

Позиционна бройна система е тази, при която стойността на цифрата се определя от нейното място в поредицата. Броят на различните цифри в една позиционна система се нарича основа на на тази бройна система Q. Тези цифри са символи, обозначаващи целите числа от 0 до Q-1(основата на бройната система - 1). В десетичната бройна система Q=10 и цифрите, които се използват, са от 0 до 9. В позиционните бройни системи стойноста на всеки разряд е по-голяма от съседния му в дясно толкова пъти, колкото е основата на бройната система (в десетичната бройна система 10 пъти).

В общия случай за числата в бройна система с основа Q:

(a_na_{n-1}...a_1a_0,c_1c_2c_3...)_Q =  \sum_{k=0}^n a_kQ^k + \sum_{k=1}^\infty c_kQ^{-k}

където Qk и Q−k са теглата на съответните цифри, a k тяхната позиция в записа на числото.

Най-често използвани бройни системи:

 

* Десетична бройна система - цифри: 0,1,2,3,4,5,6,7,8,9
15210 = 2.100 + 5.101 + 1.102 =152

* Двоична бройна система - цифри: 0,1   101112 = 1.20 + 1.21 + 1.22 + 0.23 + 1.24 = 1+2+4+16 = 23

В един байт могат да се запишат числа от 0 до 255. В много случаи това не е достатъчно и затова се използват по няколко последователни байта за записване на едно число. Например 2 байта са т.н. "дума" (word) = 16bit. 4byte = "двойна дума" (double word) или (dword) = 32bit

Въпреки простотата си, двоичната система има един голям практически недостатък. Числата записани в двоична система имат твърде много цифри. Работата с такива многоцифрени числа просто не е удобно от човешка гледна точка. Затова в практиката се е наложила шестнайсетичната бройна система. Тоест с основа 16. За записване на числа в шестнайсетична система ни трябват съответно 16 цифри. Тъй като арабските цифри са само 10 е прието за останалите цифри да се използват латинските букви от "A" до "F.

 

* Шестнадесетична бройна система - цифри: 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
7A116 = 1.160 + 10.161 + 7.162 = 1+160+1792 = 1953

За обозначаване на шестнайсетичните числа в програмирането се използват няколко начина:

1. Суфикс "
h" - 29ch
2. Префикс "$" - $29
c
3. Префикс "0
x" - 0x29c
* Осмична бройна система - цифри:
0,1,2,3,4,5,6,7
  13072 = 7.80 + 0.81 + 3.82 + 1.83 = 7+0+192+512 = 711

 

Таблица на използваните най-често позиционни бройните системи

Десетична

Двоична

Осмична

Шестнадесетична

0

0000

0

0

1

0001

1

1

2

0010

2

2

3

0011

3

3

4

0100

4

4

5

0101

5

5

6

0110

6

6

7

0111

7

7

8

1000

10

8

9

1001

11

9

10

1010

12

A

11

1011

13

B

12

1100

14

C

13

1101

15

D

14

1110

16

E

15

1111

17

F

Преобразуване

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

от двоична в десетична

Пример : Имаме числото 101011 в двоична бройна система за да го превърнем в десетична бройна система трябва да сумираме теглата съдържащи логическа единица. Всяка цифра от двоичното число е умножено по две на степен отговаряща на мястото на цифрата - 1

101011 = 1 * 25 + 0 * 24 + 1 * 23 + 0 * 22 + 1 * 21 + 1 * 20 = 43

Зад. 1 За упражнение се опитайте да пресметнете стойността на следните двоични числа:

101010102 = ?
010101012 = ?
110011002 = ?
001100112 = ?

От двоична в шестнадесетична

Тъй като и 2 и 16 са точни степени на 2, то всяка шестнайсетична цифра е точно равна на някое 4 цифрено двоично число (4 цифрените двоични числа са точно 16 - от 0000b до 1111b )

Да кажем че имаме някакво двоично число:

1010011100
b

1. Разделяме го на групи от по 4 бита от дясно наляво. Ако броят на цифрите не е кратен на 4 - добавяме нули в най-дясната група.
Тоест: 10 1001 1100
b -> 0010 1001 1100b

2. Заместваме всяка група със съответната шестнайсетична цифра от таблицата:

0010 1001 1100 -> $29
c

Пример : 11101001110010(2)

Разделяме числото на полубайтове и според таблицата гледаме за да получим верния отгвор 0011|1010|0111|0010=3A72(16)

От шестнадесетична в двоична

Сигурно вече се досещате, че обратното преобразуване от шестнайсетична система в двоична е също проста операция. Просто заместваме всяка шестнайсетична цифра с двоичният и еквивалент от табличката горе:

$ab25 = 1010 1011 0010 0101b

  Превръщането на числата от десетична в двоична или шестнадесетична бройна система става, като се дели многократно числото на основата на бройната система. Остатъка при всяко деление представлява една цифра на числото в бройната система.

От десетична в двоична

За да превърнем число от десетична в двоична бройна система ние трябва да го разеляме на 2 докато не получим остатък 0 или 1. Ако числото не може да се дели на 2 изваждаме 1 единица и я пишем след резултата, а ако може пишем 0 Пример : 87(10) от десетична в двоична

                     87:2=43 | 1

                     43:2=21 | 1

                     21:2=10 | 1

                     10:2=5 | 0

                     5:2=2 | 1

                     2:2=1 | 0

                     1:2=0 | 1

след това за да получим двоичното число вземаме единиците и нулите както сме ги получили но от долу на горе т.е. получаваме 1010111(2) в двоична бройна система за числото 87(10) в десетична

За да получим двоичнен еквивалент на десетична дроб се извършва последователно умножаване по основата на бройната система ( в случая 2 ) до достигане на желаната точност. При всяко умножаване цялата част се явява съответен разряд от двоичния еквивалент. Никога обаче не може да се получи точна десетична дроб тъй като винаги има остатък. За това е прието умножението да става 5-10 пъти за да се получи сравнително точно число с малка грешка.

Пример : 0.386(10)

                     0.386*2=0.772

                     0.772*2=1.544 ( от тук вадим единица )

                     0.544*2=1.088

                     0.088*2=0.176

                     0.176*2=0.352

                     За да получим числото вземаме цялата част от всеки отговор от горе на долу и получаваме 0.01100(2) в двоично бройна система за числото 0.386 в десетична

 

 

Задача 1 : превърнете 11110101000101102 в шестнадесетична и десетична бройна система

Разбира се винаги можете да използвате калкулатора на Windows за да правите подобни преобразования, но известни упражнения ще ви дадат разбирането, което няма как по друг начин да получите.



Как се брои в различните бройни системи:

"По еднакъв начин" е краткият отговор.
За да стане ясно да си припомним как броим в десетична система:

1. Увеличаваме най-младшата цифра с 1.
2. Ако полученият резултат е равен на десет - цифрата "превърта" в нула, а ние провеждаме същата операция на следващата цифра.

Това по всъщност е начинът на броене във всяка бройна система. Просто превъртането става не на 10 а на съответната основа на бройната система. При двоичната система на 2, при шестнайсетичната на 16 и т.н.

Броене в двоична система:

000
001
010 -> тук цифрата превърта и увеличаваме следващата
011
100 -> тук също, но следващата също превърта и увеличаваме третата.
101
110 -> пак превърта
111
000 -> тук превъртат и трите цифри и трябва да въведем четвърта, но надявам се този пример е достатъчен.

Броене в шестнайсетична система:

0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
a, b, c, d, e, f, 10 (превъртане), 11, 12
13, 14, 15, 16, 17, 18, 19, 1
a, 1b, 1c, 1d, 1e, 1f, 20 (отново), 21 ...
...
fa, fb, fc, fd, fe, ff, 100 (отново - тук числото става трицифрено)

Упражнение:
Задача 2: Преобразувайте дадените числа от десетична в двоична и шестнайсетична система.
Направете обратно преобразуване в десетична за да проверите резултата:

423, 321, 111, 255, 128, 192, 65535, 65536


Превръщане от десетична в осмична бройна система
Пример: 2005
2005 / 8 = 5 (2005 / 8 = 250 цяло и 5/2005 => 5 остатък)
250 / 8 = 2 ...
31 / 8 = 7 ... ^
3 / 8 = 3 |
0 - спираме !

Полученото 8мично (8) число се образува от остатъците отдлу-нагоре:

3 7 2 5 (8) = 2005 (10)



Превръщане от осмична в десетична бройна система

Пример: 3725
Начин:
Номерираме числата като започнем от дясно наляво с последователни цифри и умножаваме всяко число с повдигнатата 8 на степен позицията на съответното число след което сумираме всички числа.

5*80 + 2*81 + 7*82 +3*83 =5*1 +2*8+7 * 64+ 3*512= 5 +16+448+1536=2005
Получихме на колко е равно:
3725 (8) = 2005 (10)

Превръщане от шестнадесетична в десетична бройна система
Пример: 7A1
Номерираме числата като започнем от дясно наляво с последователни цифри и умножаваме всяко число с повдигнатата 8 на степен позицията на съответното число след което сумираме всички числа.
7A116 = 1.160 + 10.161 + 7.162 = 1+160+1792 = 1953

7D5 (16) = 2005 (10)

Задачи за упражнение

Задача 1: Превърнете от двоична в десетична, осмична и шестнадесетична система:
1010011101

11111111

1111111111111111

100011001101
Задача 2: Превърнете от десетична в двоична, осмична и шестнадесетична система:

1243

870

256

3984
Задача 3: Превърнете от шестнадесетична в двоична, десетична и осмична система:

2A3D

FF

FFFF

4A0E1

Задача 4: Превърнете от осмична в двоична, десетична и шестнадесетична система:

12045

7727

3400