aFizyka logo

Reprezentacja liczb całkowitych w dowolnym systemie pozycyjnym

System pozycyjny

System pozycyjny, to taki sposób reprezentowania liczby, w którym wartość liczby zależy od pozycji cyfry w ciągu cyfr.

Liczba zapisana w dowolnym systemie pozycyjnym

an-1 an-2... a1a0

gdzie:

Rozwinięcie dowolnej liczby zapisuje się według poniższego wzoru

an-1⋅pn-1+ an-2⋅pn-2+...+ a1⋅p1+ a0⋅p0

gdzie p, to podstawa systemu

Przykład rozwinięcia liczby dziesiętnej

532=5⋅100+3⋅10+2⋅1=5⋅102+3⋅101+2⋅100

Jak odczytać wartość liczby zapisanej w systemie dwójkowym?

Aby obliczyć wartość dziesiętną liczby zapisanej w systemie dwójkowym korzystamy ze wzoru na rozwinięcie, w którym podstawą systemu jest liczba 2 ( w systemie trójkowy jest 3 itd)

Liczba 101011(2)=?(10)

1⋅25+0⋅24+1⋅23+0⋅22+1⋅21+1⋅20=25+23+21+20=32+8+2+1=43

Ciąg bitów

Ciąg bitów jako impulsy prądu mogą być binarnym rozwinięciem liczby

ciąg bitów

Najbardziej znaczący bit stoi z lewej strony, a najmniej znaczący z prawej strony rozwinięcia. Możemy zadać pytanie: Jaka jest wartość ciągu bitów przedstawionych na drugim wykresie?

011010(2)=?(10)

0⋅25+1⋅24+1⋅23+0⋅22+1⋅21+0⋅20=24+23+21=16+8+2=26

System szesnastkowy

System szesnastkowy oprócz cyfr zawiera symbole pierwszych sześciu wielkich liter alfabetu, czyli A, B, C, D, E i F. Symbole te odpowiednio odpowiadają wartościom 10, 11, 12, 13, 14, 15.

Przykładowo liczba szesnastkowa 4AD(16) w systemie dziesiętnym odpowiada wartości:

4AD=4⋅162+A⋅161+D⋅160=4⋅162+10⋅161+13⋅160=4⋅256+10⋅16+13⋅1=1197(10)

Schemat Hornera- zamiana z dowolnego systemu na dziesiętny

Liczba z dowolnego systemu pozycyjnego spełnia warunek wielomianu

warunek wielomianu

gdzie:

Możemy skorzystać ze schematu Hornera do obliczenia jej wartości w systemie dziesiętnym. Czyli sprowadzić liczbę z dowolnego systemu pozycyjnego do systemu dziesiętnego

schemat hornera

Przykładowy program, który to realizuje napisany w Visual Studio C#

program schemat hornera

Ze względu na powiązanie tego tematu z tematem następnym (Zamiana z systemu 10 na dowolny) odpowiednia funkcja realizująca schemat Hornera została zapisana w bibliotece, z której będzie korzystać nasza aplikacja

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;
        }
    }
}

Poniżej pełny kod źródłowy klasy Form głównej formatki aplikacji

Form1.cs


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();
        }
    }
}