Algoritmus pre prevod medzi ľubovoľnými sústavami
Jednoduchý algoritmus pre prevod medzi ľubovoľnými číselnými sústavami využívajúce Hornerovho schéma vrátane zdrojových kódov v C# .NET.
private string ConvertToBase(int numberOfBase, int value) { Stack<char> result = new Stack<char>(); while (value > 0) { int rest = value % numberOfBase; result.Push(rest > 9 ? Convert.ToChar(rest + 55) : rest.ToString()[0]); value = (value - rest) / numberOfBase; } return new string(result.ToArray()); } private int ConvertFromBase(int numberOfBase, string value) { int result = 0; foreach (char rough in value.Substring(0, value.Length - 1)) result = (result + GetNumber(rough)) * numberOfBase; return result + GetNumber(value[value.Length - 1]); } private int GetNumber(char val) { try { return int.Parse(val.ToString()); } catch { return (int)val - 55; } }
Prevod do zadanej sústavy prebieha najznámejším spôsobom - odoberiem zo základného čísla celočíselný zvyšok po delení zvolenú sústavou a zapíšem ho. Zmenšené základné číslo vydelím (teraz už bez zvyšku) zvolenú sústavou a takto pokračujem, kým mi nezostane zo základného čísla 0. Navyše tu využívam zásobník, takže výsledok nemusím prevracať - ale len postavím string z poľa znakov.
Prevod zo sústavy je o niečo zaujímavejšia - keďže využívam Hornerovho schémy. Bohužiaľ neviem, ako to efektívne popísať - proste Hornerovho schéma vyzerá práve tak - čiže:
An = čísloSoustavy * (A (n + 1) + čísloSoustavy * (...
Pre začiatočníkov:
Convert.ToChar je metóda, ktorej prametr môže byť ASCII poradie znaku - toho tu využívam. V ASCII začína Latin až od 64. znaku. Preto musím k maximálnemu číslu desiatkovej sústavy - 9 - pripočítať ešte 55. 55 + 9 = 64 ... A naopak char sa dá prekonvertovať do ASCII poradí ... Toho využívam tu: (int) val a odpočtu zase oných 55 ...
V ďalšej lekcii, Prevod čísel medzi číselnými sústavami , si ukážeme algoritmy pre prevod čísel medzi číselnými sústavami.