aFizyka logo

Zamiana z systemu dziesiętnego na dowolny

Zamiana liczby zapisanej w systemie dziesiętnym na inny odbywa się jednakowa metoda niezależnie od podstawy systemu, na który jest zamieniana podana liczba zapisana w systemie dziesiętnym. Jedyną różnicą jest odpowiednie ograniczenie możliwych znaków (w tym cyfr) przeznaczonych do zakodowania zamienianej liczby w nowym systemie.

Przykładowo w systemie dwójkowym (binarnym) dostępnych znaków do przeznaczonych do kodowania jest dwa (0,1). W systemie piątkowym będzie ich już pięć (0,1,2,3,4). W szesnastkowym będzie ich szesnaście (0,1..9,A,B,C,D,E). Ogólnie można sobie wymyślić dowolny system oparty na dowolnej ilości znaków kodujących wartości liczbowe z systemu dziesiętnego

Metoda zamiany liczby całkowitej z systemu dziesiętnego na dwójkowy

Chcąc zapisać liczbę z systemu dziesiętnego na przykład w systemie dwójkowym (binarnym) wykonujemy dzielenie z resztą tej liczby przez dwa (podstawę systemu docelowego), zapisujemy wszystkie reszt z dzieleń do momentu otrzymania ilorazu równego zero. Wynikiem jest odczyt od końca kolejnych reszt.

Na przykład: jakie jest rozwinięcie binarne liczby dziesiętnej 749(10)=?(2)

Uwaga: Operator div oznacza część całkowitą z dzielenia, operator mod oznacza resztę z dzielenia. W języku C# użyjemy operatorów arytmetycznych / (jako div) i % (jako mod)

wyznaczenie rozwinięcia dwójkowego liczby dziesiętnej

749(10) = 1011101101(2)

Metoda zamiany liczby całkowitej z systemu dziesiętnego na szesnastkowy

Wyznaczanie rozwinięcia szesnastkowego liczby dziesiętnej odbywa się na tych samych zasadach co rozwinięcia binarnego liczby dziesiętnej z tą różnicą, że podstawą jest liczba 16.

Chcąc zapisać liczbę z systemu dziesiętnego w systemie szesnastkowym wykonujemy dzielenie z resztą tej liczby przez 16 (podstawę systemu docelowego), zapisujemy wszystkie reszt z dzieleń do momentu otrzymania ilorazu równego zero. Każdą z reszt większą od 9 zamieniamy na odpowiedni symbol literowy. Wynikiem jest odczyt od końca kolejnych reszt.

Na przykład: jakie jest rozwinięcie szesnastkowe liczby dziesiętnej 749(10) ?

wyznaczanie rozwinięcia szesnastkowego liczby dziesiętnej

749(10) = 2ED(16)

Schemat algorytmu zamiany liczby z systemu dziesiętnego na dowolny metodą iteracyjną

Schemat algorytmu zamiany liczby z systemu dziesiętnego na dowolny metodą iteracyjną

Schemat przedstawia funkcję dwuargumentową. Pierwszy argument (int l) to wartość zamienianej liczby z systemu dziesiętnego, drugi argument (byte p), to podstawa systemu na, który jest przeprowadzana zamiana. Funkcja zwraca wynik w postaci łańcucha znaków (typ String)

Kod funkcji realizujący iteracyjną zamianę liczby dziesiętnej na dowolny system liczbowy zapisany w C#


        public static String zamiana10naInnyIteracja(int l, byte p)
        {
            String wynik = "";
            while (l > 0)
                {
                if (l % p > 9)
                    switch (l%p){
                      case 10: wynik = "A" + wynik;break;
                      case 11: wynik = "B" + wynik; break;
                      case 12: wynik = "C" + wynik; break;
                      case 13: wynik = "D" + wynik; break;
                      case 14: wynik = "E" + wynik; break;

                    }
                    else wynik = (l % p).ToString() + wynik;
                    l = l / p;
                }
            return wynik;
        }

Schemat algorytmu zamiany liczby z systemu dziesiętnego na dowolny metodą rekurencyjną

Schemat algorytmu zamiany liczby z systemu dziesiętnego na dowolny metodą rekurencyjną

Schemat przedstawia funkcję dwuargumentową. Pierwszy argument (int l) to wartość zamienianej liczby, drugi argument (byte p), to podstawa systemu na, który jest przeprowadzana zamiana. Wynikiem jest łańcuch znaków (typ String)

Kod funkcji rekurencyjnego zamieniania liczby z systemu dziesiętnego na dowolny zapisany w języku C# przedstawiam poniżej


        public static String zamiana10naInnyRekurencja(int l,byte p)
        {
            String wynik="";
            if (l > 0)
            {
                wynik+=zamiana10naInnyRekurencja(l / p, p);
                if (l % p > 9)
                    switch (l % p)
                    {
                        case 10: wynik += "A"; break;
                        case 11: wynik += "B"; break;
                        case 12: wynik += "C"; break;
                        case 13: wynik += "D"; break;
                        case 14: wynik += "E"; break;
                        case 15: wynik += "F"; break;
                    }
                else wynik+= (l % p).ToString();
            }  
            return wynik;
        }

Aplikacja realizująca obie metody

Przykładowa aplikacja realizująca obie metody wygląda jak poniżej

aplikacja zamiany liczby z systemu dziesiętnego na dowolny

Kod realizujący tę aplikację bazuje na klasie zawierającą omówione funkcje oraz na pliku z główną klasą Form zbudowanej formatki aplikacji.

Plik z kodem klasy SystemyLiczbowe.cs


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _1AlgPozycyjneReprezentacjeliczb
{
    internal class SystemyLiczbowe
    {
        //l to liczba dziesietna,
        //p to podstawa systemy na ktory jest przeprowadzana zamiana
        public static String zamiana10naInnyRekurencja(int l,byte p)
        {
            String wynik="";
            if (l > 0)
            {
                wynik+=zamiana10naInnyRekurencja(l / p, p);
                if (l % p > 9)
                    switch (l % p)
                    {
                        case 10: wynik += "A"; break;
                        case 11: wynik += "B"; break;
                        case 12: wynik += "C"; break;
                        case 13: wynik += "D"; break;
                        case 14: wynik += "E"; break;
                        case 15: wynik += "F"; break;
                    }
                else wynik+= (l % p).ToString();
            }  
            return wynik;
        }
        public static String zamiana10naInnyIteracja(int l, byte p)
        {
            String wynik = "";
            while (l > 0)
                {
                if (l % p > 9)
                    switch (l%p){
                      case 10: wynik = "A" + wynik;break;
                      case 11: wynik = "B" + wynik; break;
                      case 12: wynik = "C" + wynik; break;
                      case 13: wynik = "D" + wynik; break;
                      case 14: wynik = "E" + wynik; break;

                    }
                    else wynik = (l % p).ToString() + wynik;
                    l = l / p;
                }
            return wynik;
        }
        private static byte Wartosc(Char znak)
        {
            byte a = 0;
            switch (znak)
            {
                case 'A': a = 10; break;
                case 'B': a = 11; break;
                case 'C': a = 12; break;
                case 'D': a = 13; break;
                case 'E': a = 14; break;
                case 'F': a = 15; break;
                default: a = Convert.ToByte(znak-'0'); break;
            }
            return a;
        }
        //s- to łańcuch znaków podanej liczby
        //p- podstawa systemu
        public static long DowolnyNaDziesietny(String s,byte p)
        {
            long wynik = 0;
            int i=0;
            while(i< s.Length-1)
            {
                wynik = (wynik + Wartosc(s[i])) * p;
                i++;
            }
            wynik+= Wartosc(s[i]);
            return wynik;
        }
    }
}

Plik z kodem formatki


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace _1AlgPozycyjneReprezentacjeliczb
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //ustaw pierwszy indeks w combobox na aktywny
            comboBox1.SelectedIndex = 0;
            comboBox2.SelectedIndex = 0;
        }

        private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
        {
            //zabezpiecz przed znakami nienumerycznymi
            if (e.KeyChar == 8) return;//wyskocz jak BackSpace
            if (e.KeyChar < '0' || e.KeyChar > '9') e.Handled = true;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (textBox1.Text.Length < 1)
            {
                MessageBox.Show("Nie podano liczby!", 
                                "Komunikat",
                                MessageBoxButtons.OK,
                                MessageBoxIcon.Warning);
                return;
            }
            int l = Convert.ToUInt16(textBox1.Text);
            byte p = Convert.ToByte(comboBox1.Text);
            if (l > 0) label3.Text = SystemyLiczbowe.zamiana10naInnyRekurencja(l, p);
            else label3.Text = "0";
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (textBox1.Text.Length < 1)
            {
                MessageBox.Show("Nie podano liczby!",
                                "Komunikat",
                                MessageBoxButtons.OK,
                                MessageBoxIcon.Warning);
                return;
            }
            int l = Convert.ToUInt16(textBox1.Text);
            byte p = Convert.ToByte(comboBox1.Text);
            if (l > 0) label3.Text = SystemyLiczbowe.zamiana10naInnyIteracja(l, p);
            else label3.Text = "0";
        }

        private void button3_Click(object sender, EventArgs e)
        {
            //zamień z dwolonego na dziesietny
            if (textBox2.Text.Length < 1)
            {
                MessageBox.Show("Nie podano liczby!", 
                                "Komunikat",
                                MessageBoxButtons.OK,
                                MessageBoxIcon.Warning);
                return;
            }
            byte p = Convert.ToByte(comboBox2.Text);
            label4.Text = SystemyLiczbowe.DowolnyNaDziesietny(textBox2.Text, p).ToString();
        }
    }
}