I Liceum Ogólnokształcące
im. Kazimierza Brodzińskiego
w Tarnowie
©2018 mgr Jerzy Wałaszek
Prezentowane materiały są przeznaczone dla uczniów szkół ponadgimnazjalnych
.
Autor artykułu: mgr Jerzy Wałaszek, wersja1.0
©2010 mgr Jerzy Wałaszek
I LO w Tarnowie
System ósemkowy
Oprócz systemu dwójkowego w informatyce powszechnie są stosowane dwa systemy - ósemkowy (oktalny) oraz szesnastkowy
(heksadecymalny). Powodem ich stosowania jest to, iż bardzo łatwo jest przeliczać pomiędzy nimi a systemem dwójkowym. Liczba ósemkowa
jest dla ludzi bardziej czytelna od liczby dwójkowej.
W systemie ósemkowym mamy 8 cyfr: 0, 1, 2, 3, 4, 5, 6 i 7. Wartość liczby ósemkowej obliczamy wg wzoru:
W
8
= c
n-1
8
n-1
+ c
n-2
8
n-2
+ ... + c
2
8
2
+ c
1
8 + c
0
c
i
, i = 0,1,...,n-1 - kolejne cyfry ósemkowe zapisu liczby
Przykład:
7231
8
= 7 × 8
3
+ 2 × 8
2
+ 3 × 8 + 1
7231
8
= 7 × 512 + 2 × 64 + 3 × 8 + 1
7231
8
= 3584 + 128 + 24 + 1
7231
8
= 3737
Istnieje również inny algorytm obliczania wartości dowolnej liczby pozycyjnej, zwany schematem Hornera. Postępujemy następująco:
Za wynik W przyjmujemy pierwszą od lewej cyfrę liczby. Kolejne cyfry liczby odczytujemy od strony lewej ku prawej.
Dopóki są dalsze cyfry, wynik W mnożymy przez podstawę systemu i dodajemy do niego kolejną cyfrę, aż do ich wyczerpania.
Na końcu W zawiera wartość liczby.
Przykład:
Mamy znaleźć wartość liczby ósemkowej 7231
8
. Kolejne cyfry to 7, 2, 3 i 1. Zaczynamy:
W ← 7
W ← W × 8 + 2 = 7 × 8 + 2 = 58
W ← W × 8 + 3 = 58 × 8 + 3 = 467
W ← W × 8 + 1 = 467 × 8 + 1 = 3737 - koniec
Schemat Hornera wykorzystują programy obliczające wartość liczb w innych systemach pozycyjnych.
Do wyznaczenia zapisu liczby L w systemie ósemkowym możemy wykorzystać poznany wcześniej algorytm dla systemu dwójkowego, po
drobnej modyfikacji:
L dzielimy przez podstawę systemu docelowego. Za kolejną od końca cyfrę przyjmujemy resztę z dzielenia. Za nowe L
przyjmujemy wynik dzielenia całkowitoliczbowego. Jeśli L jest różne od zera, operację powtarzamy. Inaczej wyświetlamy
otrzymane cyfry w kierunku odwrotnym do ich wyznaczenia.
Przykład:
Mamy znaleźć reprezentację liczby 10000 w systemie ósemkowym.
10000 : 8 = 1250, reszta 0
1250 : 8 =
156, reszta 2
156 : 8 =
19, reszta 4
19 : 8 =
2 reszta 3
2 : 8 =
0 reszta 2
10000 = 23420
8
Liczby ósemkowe bardzo prosto przeliczamy na system binarny. Jedna cyfra ósemkowa zawsze przechodzi w trzy cyfry binarne:
cyfra
ósemkowa
cyfry
dwójkowe
0
000
1
001
2
010
3
011
4
100
5
101
6
110
7
111
Gdy zamieniamy liczbę ósemkową na odpowiadającą jej co do wartości liczbę binarną, każdą cyfrę ósemkową zastępujemy trzema cyframi
binarnymi zgodnie z tabelką. Na przykład, liczba ósemkowa 23420
8
ma w systemie dwójkowym następującą postać:
23420
8
→
2
3
4
2
0
010 011 100 010 000 →010011100010000
2
Zwróć uwagę, że dla człowieka liczba ósemkowa jest bardziej czytelna od jej odpowiednika dwójkowego. To jest właśnie powód popularności
systemu ósemkowego wśród programistów, którzy muszą przekazywać do programów wartości związane z systemem dwójkowym.
W drugą stronę postępujemy podobnie. Liczbę dwójkową dzielimy na trójki bitów. Jeśli ostatnia trójka jest niepełna, uzupełniamy ją bitami o
wartości 0. Następnie każdą z trójek zastępujemy odpowiadającą im cyfrą ósemkową. Konwersja skończona. Dla przykładu przekształćmy jakąś
liczbę dwójkową na ósemkową:
1101110101011101010101
2
→ 001 101 110 101 011 101 010 101
1
5
6
5
3
5
2
5
→ 15653525
8
System szesnastkowy
System szesnastkowy posiada 16 cyfr: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F. Pierwsze 10 cyfr jest takie same jak w systemie dziesiętnym.
Za kolejne 6 cyfr przyjęto pierwsze litery alfabetu. Litery te w zapisie liczby mogą być małe lub duże. Wartości tych cyfr to kolejno A=10, B=11,
C= 12, D=13, E=14, F=15.
Wartość liczby szesnastkowej obliczamy ze wzoru:
W
16
= c
n-1
16
n-1
+ c
n-2
16
n-2
+ ... + c
2
16
2
+ c
1
16 + c
0
c
i
, i = 0,1,...,n-1 - kolejne cyfry szesnastkowe zapisu liczby
Przykład:
AFD3
16
= 10 × 16
3
+ 15 × 16
2
+ 13 × 16 + 3
AFD3
16
= 10 × 4096 + 15 × 256 + 13 × 16 + 3
AFD3
16
= 40960 + 3840 + 208 + 3
AFD3
16
= 45011
To samo schematem Hornera:
W ← 10
W ← W × 16 + 15 = 160 + 15 = 175
W ← W × 16 + 13 = 2800 + 13 = 2813
W ← W × 16 + 3 = 45008 + 3 = 45011
Liczbę dziesiętną przeliczamy na 16 wg poznanego schematu:
Przykład:
Mamy znaleźć reprezentację liczby 99999 w systemie szesnastkowym.
99999 : 16 = 6249, reszta 15 - cyfra F
6249 : 16 =
390, reszta 9
390 : 16 =
24, reszta 6
24 : 16 =
1. reszta 8
1 : 16 =
0, reszta 1
99999 = 1869F
16
Liczby szesnastkowe również jest łatwo przeliczać na liczby dwójkowe. W tym przypadku każda cyfra szesnastkowa zastępuje cztery cyfry
binarne - dzięki temu liczby szesnastkowe bardzo dobrze odwzorowują dane 8, 16, 32 bitowe. Tabelka konwersji jest następująca:
cyfra
szesnastkowa
cyfry
dwójkowe
0
0000
1
0001
2
0010
3
0011
4
0100
5
0101
6
0110
7
0111
8
1000
9
1001
A
1010
B
1011
C
1100
D
1101
E
1110
F
1111
Przeliczanie liczby szesnastkowej na ósemkową polega na zamianie każdej cyfry szesnastkowej grupą 4 cyfr binarnych:
AF9D7
16
→
A
F
9
D
7
1010 1111 1001 1101 0111 →10101111100111010111
2
W drugą stronę bity rozdzielamy poczynając od końca liczby na grupy 4 bitowe. Ostatnia grupa może być niepełna - dopełniamy ją bitami o
wartości 0. Każdą grupę zastępujemy odpowiadającą im cyfrą szesnastkową:
1101111101111111000101
2
→ 0011 0111 1101 1111 1100 0101
3
7
D
F
C
5
→ 37DFC5
8
Poniższy program w języku C++ oblicza wartość liczby pozycyjnej w dowolnym systemie od 2 do 16. Cyfry większe od 9 należy podawać jako
duże litery. Na początku wpisujemy podstawę systemu, w którym jest zapisana liczba, a następnie samą liczbę.
// Obliczanie wartości liczb pozycyjnych
// (C)2011 I LO w Tarnowie
//--------------------------------------
#include <iostream>
using
namespace
std
;
int
main
()
{
char
cyfry
[
256
];
unsigned
p
,
i
,
W
,
c
;
cin
>>
p
;
// odczytujemy podstawę
cin
>>
cyfry
;
// odczytujemy cyfry
W
=
cyfry
[
0
] -
48
;
// wartość cyfry
if
(
W
>
9
)
W
-=
7
;
// korekta dla cyfr literowych
for
(
i
=
1
;
cyfry
[
i
];
i
++)
{
c
=
cyfry
[
i
] -
48
;
if
(
c
>
9
)
c
-=
7
;
W
=
W
*
p
+
c
;
}
cout
<<
W
;
return
0
;
}
16
CCFF95
13434773
Drugi program przelicza podaną liczbę dziesiętną na liczbę w innym systemie liczbowym. Pierwszy parametr to podstawa systemu docelowego.
Drugi parametr to wartość dziesiętna do przeliczenia.
// Przeliczanie na inny system liczbowy
// (C)2011 I LO w Tarnowie
//--------------------------------------
#include <iostream>
using
namespace
std
;
int
main
()
{
char
cyfry
[
256
];
unsigned
p
,
i
,
L
,
c
;
cin
>>
p
;
// odczytujemy podstawę
cin
>>
L
;
// odczytujemy liczbę
for
(
i
=
0
;
L
;
i
++)
{
c
=
L
%
p
;
// wyliczamy cyfrę
if
(
c
>
9
)
c
+=
7
;
// poprawka na cyfry literowe
cyfry
[
i
] =
c
+
48
;
// wstawiamy cyfrę do tablicy
L
/=
p
;
// modyfikujemy liczbę
}
do
cout
<<
cyfry
[--
i
];
// cyfry wyświetlamy odwrotnie
while
(
i
);
cout
<<
endl
;
return
0
;
}
16
65535
FFFF
Dokument ten rozpowszechniany jest zgodnie z zasadami licencji
GNU Free Documentation License.
Pytania proszę przesyłać na adres email:
W artykułach serwisu są używane cookies. Jeśli nie chcesz ich otrzymywać,
zablokuj je w swojej przeglądarce.