Algoritmus pro převod mezi libovolnými soustavami

Algoritmy Matematické Algoritmus pro převod mezi libovolnými soustavami

Jednoduchý algoritmus pro převod mezi libovolnými číselnými soustavami využívající Hornerovo schéma včetně zdrojových kódů 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;
    }
}

Převod do zadané soustavy probíhá nejznámějším způsobem - odeberu ze základního čísla celočíselný zbytek po dělení zvolenou soustavou a zapíši jej. Zmenšené základní číslo vydělím (nyní již beze zbytku) zvolenou soustavou a takto pokračuji, dokud mi nezbude ze základního čísla 0. Navíc zde využívám zásobník, takže výsledek nemusím převracet - nýbrž jen postavím string z pole znaků.

Převod ze soustavy je o něco zajímavější - jelikož využívám Hornerova schématu. Bohužel nevím, jak to efektivně popsat - prostě Hornerovo schéma vypadá právě tak - čili:

An = čísloSoustavy * ( A(n + 1) + čísloSoustavy * (...

Pro začátečníky:

Convert.ToChar je metoda, jejíž prametr může být ASCII pořadí znaku - toho zde využívám. V ASCII začíná latinská abeceda až od 64. znaku. Proto musím k maximálnímu číslu desítkové soustavy - 9 - přičíst ještě 55. 55 + 9 = 64... A naopak char se dá překonvertovat do ASCII pořadí... Toho využívám zde: (int)val a odečtu zase oněch 55...


 

  Aktivity (1)

Článek pro vás napsal matesax
Avatar

Jak se ti líbí článek?
Celkem (1 hlasů) :
4444 4


 


Miniatura
Předchozí článek
Algoritmus náhodného čísla
Miniatura
Všechny články v sekci
Matematické algoritmy

 

 

Komentáře

Avatar
David Čápka
Tým ITnetwork
Avatar
David Čápka:

Nechtěl bys algoritmus nějak více popsat? Jak postupuje, co která část dělá a tak podobně?

Odpovědět 12.12.2012 11:41
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
matesax
Redaktor
Avatar
Odpovídá na David Čápka
matesax:

Omlouvám se, nyní je můj notebook v opravě, takže nemohu reagovat flexibilně. Přišlo mi to jasné, ale dobrá - přidám komentáře...

 
Odpovědět 13.12.2012 14:13
Avatar
Michael Olšavský:

Jen takové vylepšení pro začátečníky: mohl by si místo převádění na znaky a přičítání hodnoty pro získání čísla vytvořit pole[1-9]. Myslím, že by to lépe pochopili. Ale není to špatné.

 
Odpovědět 2.1.2013 21:40
Avatar
Kit
Redaktor
Avatar
Odpovídá na Michael Olšavský
Kit:

Místo pole by to chtělo spíš string "0123456789AB­C...Z".

Odpovědět 2.1.2013 21:46
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Michael Olšavský
matesax:

Přeci mi nebudeš tvrdit, že je efektivnější vypisovat se se všemi znaky... Proto je to algoritmus pro převod mezi libovolnou soustavou... :) Spíše přidám lepší komenty...

Editováno 2.1.2013 21:51
 
Odpovědět 2.1.2013 21:48
Avatar
Odpovídá na Kit
Michael Olšavský:

Jojo. Pravda. Promiň nějak mi nedošlo že to de převést i do soustav s písmeny (hexadecimální). Díky za opravu

 
Odpovědět 2.1.2013 21:49
Avatar
Odpovídá na matesax
Michael Olšavský:

Tak k tomu alespoň dopiš ty komentáře.

 
Odpovědět 2.1.2013 21:50
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

Ano, je efektivnější, když to budeš vybírat ze stringu. Dokonce i naopak.

Odpovědět 2.1.2013 22:01
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.