Számrendszerek, algoritmusok


Példák algoritmusokra

Az tárgyalt algoritmusok leírását a legtöbb esetben rövid JavaScript programokkal is bemutatjuk. A példák kipróbálásához felhasználható online JavaScript interpreter:

Online JavaScript Interpreter by Peter Jipsen, Chapman University (January 2013).
http://math.chapman.edu/~jipsen/js/ (2020-11-19)

Megjegyzés: Ha a fenti link valamilyen oknál fogva nem működik, használjuk az alábbi linket.

A JavaScript programok folyamatábráját megjeleníthetjük az alábbi webes alkalmazás segítségével:

Live code editor. Created by Bogdan Lyashenko.
https://bogdan-lyashenko.github.io/js-code-to-svg-flowchart/docs/live-editor/index.html (2022-10-02)

A folyamatábra a 'for' ciklust nem megfelelően ábrázolja, ezért érdemes ezeket mindig átírni 'while' ciklusra, mielőtt megjelenítenénk a program folyamatábráját.



Példák algoritmusokra:
4.1. bináris szám átalakítása hexadecimális számmá

1. egész szám átváltása

Példa: 1010|11012 = ?16

Két fontos dolgot tudnunk kell az algoritmus megértéséhez:

(1) Mivel a kettes számrendszerbeli (egész) számok rendszerint elég sok számjegyből állnak, érdemes a bináris számjegyeket jobbról négyes csoportokra osztani (az utolsó csoportot pedig balról kiegészíteni "vezető" nullákkal).

Például ha a 1010010110 bináris szám számjegyeit jobbról négyes csoportokra bontjuk, akkor
    0010|1001|0110
adódik.

(2) A hexadecimális számok számjegyei a decimális számjegyek (0, 1, ..., 9) mellett az A, B, C, D, E és F számjegyeket is magukba foglalják.

Hexadecimális számjegyek

A bináris egész számokat hexadecimális számokká alakító algoritmus lépései:

Eredmény: 1010|11012 = AD16


A fenti példa táblázatos formában:

1010|11012 = ?16

bin
számjegy
helyi érték szorzat hexa
számjegy
1 23=8 8
0 22=4 0
1 21=2 2
0 20=1 0
összesen 10 A
1 23=8 8
1 22=4 4
0 21=2 0
1 20=1 1
összesen 13 D

Eredmény:
1010|11012 = AD16

Ellenőrzés:
    (1) 1010|11012 = 1*27 + 0*26 + 1*25 + 0*24 + 1*23 + 1*22 + 0*21 + 1*20 = 128 + 32 + 8 + 4 + 1 = 17310 (ld. 2. algoritmus)
    (2) AD16 = 10*161 + 13*160 = 10*16 + 13*1 = 160 + 13 = 17310 (ld. 3. algoritmus)
A két szám megegyezik (ok).


A fenti algoritmust megvalósító JavaScript program:

// bináris szám átalakítása hexadecimális számmá 

function dec2hex(sz) {
 var hx="-1";
 switch(sz) {
  case 10: hx="A"; break;
  case 11: hx="B"; break;
  case 12: hx="C"; break;
  case 13: hx="D"; break;
  case 14: hx="E"; break;
  case 15: hx="F"; break;
  default: 
   hx=""+sz;  
  }
 return hx;
 }

var x="10101101";
while(x.length%4!=0) {
 x="0"+x; // vezető 0-k beírása
 }

var k=x.length-1;
var t=""; // végeredmény

var s="";
var h=0;
var helyiertek=1;

for(var i=0;i<x.length;i++) {
 s=x[k]+s;
 if(x[k]=="1") {
  h+=helyiertek;
  }
 helyiertek*=2;
 k--;
 if(i%4==3) {
  writeln("    "+s+" = "+h+" = "+dec2hex(h));
  t=dec2hex(h)+t;
  s="";
  h=0;
  helyiertek=1;
  }
 }

writeln();
writeln(x+" = "+t);

writeln("____________"); 



Példák algoritmusokra:
4.2. hexadecimális szám átalakítása bináris számmá

A fordított irányú átváltás, azaz egy hexadecimális szám átváltása bináris számmá az előző algoritmushoz teljesen hasonlóan működik. Vegyünk egy tetszőleges hexadecimális számot, és

Példa: 2AD16 = ?2

Tehát az eredmény: 2AD16 = 0010|1010|11012


Az algoritmust megvalósító JavaScript program:

// hexadecimális szám átalakítása bináris számmá 

function hex2dec(hx) {
 var sz=-1;
 switch(hx) {
  case "a":
  case "A": sz=10; break;
  case "b":
  case "B": sz=11; break;
  case "c":
  case "C": sz=12; break;
  case "d":
  case "D": sz=13; break;
  case "e":
  case "E": sz=14; break;
  case "f":
  case "F": sz=15; break;
  default: 
   sz=parseInt(hx);  
  }
 return sz;
 }

var x="2AD";

writeln("A hexadecimális szám: "+x);
writeln();

var t=""; // végeredmény

for(var i=0;i<x.length;i++) {
 var h=hex2dec(x[i]);
 var helyiertek=8;
 var s=""; // részeredmény

 while(helyiertek>=1) {
  if(h>=helyiertek) {
   s=s+"1";
   h-=helyiertek;
   }
  else {
   s=s+"0";
   }
  helyiertek/=2;
  }

 writeln("    "+x[i]+" = "+hex2dec(x[i])+" = "+s);
 if(i>0) {
  t=t+" ";
  }
 t=t+s;
 }

writeln();
writeln(x+" bináris alakja: "+t);

writeln("____________"); 



Példák algoritmusokra:
4.3. bináris törtszámok és hexadecimális törtszámok átalakítása

A bináris és hexadecimális számrendszerben ábrázolt egész számok átváltására korábban megismert algoritmusok teljesen hasonlóan működnek törtszámok esetén is.

1. példa: 0.1011|01012 = ?16

Mivel a kettes számrendszerbeli (tört) számok rendszerint elég sok számjegyből állnak, érdemes a bináris számjegyeket balról (0. után kezdődően) négyes csoportokra osztani (az utolsó csoportot pedig jobbról kiegészíteni "vezető" nullákkal).

Például ha a 0.10110101 bináris szám számjegyeit balról négyes csoportokra bontjuk, akkor
    0.1011|0101
adódik.

A bináris törtszámokat hexadecimális törtszámokká alakító algoritmus lépései:

Eredmény: 0.1011|01012 = 0.B516


A fenti példa táblázatos formában:

0.1011|01012 = ?16

bin
számjegy
helyi érték szorzat hexa
számjegy
1 23=8 8
0 22=4 0
1 21=2 2
1 20=1 1
összesen 11 B
0 23=8 0
1 22=4 4
0 21=2 0
1 20=1 1
összesen 5 5

Eredmény:
0.1011|01012 = 0.B516

Ellenőrzés:
    (1) 0.1011|01012 = 1*2−1 + 1*2−3 + 1*2−4 + 1*2−6 + 1*2−8 = 1/2 + 1/8 + 1/16 + 1/64 + 1/256 = 128/256 + 32/256 + 16/256 + 4/256 + 1/256 = 181/256 = 0.7070312510
    (2) 0.B516 = 11*16−1 + 5*16−2 = 11/16 + 5/256 = 176/256 + 5/256 = 181/256 = 0.7070312510
A két szám megegyezik (ok).


2. példa: 0.B516 = ?2

A hexadecimális törtszámokat bináris törtszámokká úgy alakítjuk át, hogy minden hexadecimális számjegyet négyjegyű bináris számmá alakítunk:
    B16=10112
    516=01012

Eredmény:
0.B516 = 0.1011|01012

Ellenőrzés:
    (1) 0.B516 = 11*16−1 + 5*16−2 = 11/16 + 5/256 = 176/256 + 5/256 = 181/256 = 0.7070312510
    (2) 0.1011|01012 = 1*2−1 + 1*2−3 + 1*2−4 + 1*2−6 + 1*2−8 = 1/2 + 1/8 + 1/16 + 1/64 + 1/256 = 128/256 + 32/256 + 16/256 + 4/256 + 1/256 = 181/256 = 0.7070312510
A két szám megegyezik (ok).

A fenti algoritmust megvalósító JavaScript program:

// bináris tört átalakítása hexadecimális törtté

var hex="0123456789ABCDEF";

var x0="0.0111001"; // eredeti tört
var x=x0.substring(2);
while(x.length%4!=0) {
 x=x+"0"; // closing 0
 }

var t=""; // végeredmény törtrésze

var s=""; // négy bites csoport
var h=0; // négy bites csoport decimális értéke
var p=8; // kezdő helyiérték

for(var i=0;i<x.length;i++) {
 s=s+x[i];
 if(x[i]==1) {
  h+=p;
  }
 p/=2;
 if(i%4==3) {
  writeln("    "+s+" = "+h+" = "+hex[h]);
  t=t+hex[h];
  s="";
  h=0;
  p=8;
  }
 }

writeln();
writeln(x0+" = 0."+t);

writeln("____________"); 



Példák algoritmusokra:
5. decimális szám átalakítása hexadecimális számmá

Egy decimális számot a legegyszerűbben úgy alakíthatunk át hexadecimális számmá, hogy a decimális számot először bináris számmá alakítjuk, majd utána a kapott bináris számot átváltjuk hexadecimális számmá.

Példa: 31410 = ?16

1. lépés

hányados maradék
314
314:2= 157 0
157:2= 78 1
78:2= 39 0
39:2= 19 1
19:2= 9 1
9:2= 4 1
4:2= 2 0
2:2= 1 0
1:2= 0 1

Tehát 31410 = 1|0011|10102 → 0001|0011|10102

2. lépés

bin
számjegy
helyi érték szorzat hexa
számjegy
0 23=8 0
0 22=4 0
0 21=2 0
1 20=1 1
összesen 1 1
0 23=8 0
0 22=4 0
1 21=2 2
1 20=1 1
összesen 3 3
1 23=8 8
0 22=4 0
1 21=2 2
0 20=1 0
összesen 10 A

Tehát 1|0011|10102 = 13A16

Eredmény:
31410 = 13A16

Ellenőrzés:
13A16 = 1*162 + 3*161 + 10*160 = 1*16*16 + 3*16 + 10*1 = 256 + 48 + 10 = 31410 (ok)


Egy decimális számot a következő algoritmussal egy lépésben is átalakíthatunk hexadecimális számmá:

hányados maradék ellenőrzés
314
314:16= 19 10=A 314=16*19+10
19:16= 1 3 19=16*1+3
1:16= 0 1 1=16*0+1

Eredmény:
31410 = 13A16


A fenti algoritmust megvalósító JavaScript program:

// decimális szám átalakítása hexadecimális számmá osztással

function hex2dec(hx) {
 var sz=-1;
 switch(hx) {
  case "a":
  case "A": sz=10; break;
  case "b":
  case "B": sz=11; break;
  case "c":
  case "C": sz=12; break;
  case "d":
  case "D": sz=13; break;
  case "e":
  case "E": sz=14; break;
  case "f":
  case "F": sz=15; break;
  default: 
   sz=parseInt(hx);  
  }
 return sz;
 }

function dec2hex(sz) {
 var hx="-1";
 switch(sz) {
  case 10: hx="A"; break;
  case 11: hx="B"; break;
  case 12: hx="C"; break;
  case 13: hx="D"; break;
  case 14: hx="E"; break;
  case 15: hx="F"; break;
  default: 
   hx=""+sz;  
  }
 return hx;
 }

var x="314"; 

writeln("Decimális szám: "+x);
writeln();

var h="";
var q=x;

while(q>0) {
 write(q+" = ");
 var m=q%16;
 h=dec2hex(m)+h;
 q=q-m;
 q=q/16;
 writeln("16*"+q+" + "+m); 
 }

writeln();
writeln("Hexadecimális szám: "+h);

writeln("__________");


16 hatványai

Egy további lehetőség egy decimális szám hexadecimális számmá alakítására a következő:

Példa: 152610 = ?2

hatvány átváltandó szám/maradék kivonások száma
1526
162=256 1526−256=1270>256 1
1270−256=1014>256 2
1014−256=758>256 3
758−256=502>256 4
502−256=246<256 5
161=16 246−16=230>16 1
230−16=214>16 2
214−16=198>16 3
198−16=182>16 4
182−16=166>16 5
166−16=150>16 6
150−16=134>16 7
134−16=118>16 8
118−16=102>16 9
102−16=86>16 10
86−16=70>16 11
70−16=54>16 12
54−16=38>16 13
38−16=22>16 14
22−16=6<16 15=F
160=1 6−1=5>1 1
5−1=4>1 2
4−1=3>1 3
3−1=2>1 4
2−1=1≥1 5
1−1=0<1 6

Eredmény:
5F616 = 5*162 + F*161 + 6*160 = 5*256 + 15*16 + 6 = 152610


A fenti algoritmust megvalósító JavaScript program:

// decimális szám átalakítása hexadecimális számmá kivonásokkal

function hex2dec(hx) {
 var sz=-1;
 switch(hx) {
  case "a":
  case "A": sz=10; break;
  case "b":
  case "B": sz=11; break;
  case "c":
  case "C": sz=12; break;
  case "d":
  case "D": sz=13; break;
  case "e":
  case "E": sz=14; break;
  case "f":
  case "F": sz=15; break;
  default: 
   sz=parseInt(hx);  
  }
 return sz;
 }

function dec2hex(sz) {
 var hx="-1";
 switch(sz) {
  case 10: hx="A"; break;
  case 11: hx="B"; break;
  case 12: hx="C"; break;
  case 13: hx="D"; break;
  case 14: hx="E"; break;
  case 15: hx="F"; break;
  default: 
   hx=""+sz;  
  }
 return hx;
 }

var x=1526; 

writeln("Decimális szám: "+x);
writeln();

var h="";
var helyiertek=1;

while(16*helyiertek<=x) {
 helyiertek*=16;
 }

while(helyiertek>=1) {
 if(helyiertek<=x) {
  var sz=0;
  while(helyiertek<=x) {
   sz++;
   x-=helyiertek;
   }
  h+=dec2hex(sz);
  writeln("   Számjegy:    "+dec2hex(sz));
  writeln("   Helyi érték: "+helyiertek);
  }
 else {
  h+="0";
  writeln("   Számjegy:    "+0);
  writeln("   Helyi érték: "+helyiertek);
  }
 helyiertek/=16;
 }

writeln();
writeln("Hexadecimális szám: "+h);

writeln("__________");




Tartalom
Boda István, 2023-24.