Site içi Arama

Ara

Python ile sayı sistemlerini birbirine çeviren program

Mehmet Yılmaz - 05.01.2008

Dijital eketronik ile ilgili konulara giriş yapıldığında ilk incelenen ve öğretilen konunun sayı sistemleri olduğu, ilgili kitapların kapağı ilk açıldığında anlaşılmaktadır. Elektronikçiler açısından da bir programlama diline başlangıç uygulamasının yine sayı sistemleri olması gerekmektedir.

Sayı sistemleri tabana göre açıklanmaktadır. En çok kullanılanları, onluk (decimal), ikilik (binary), onaltılık (hexadecimal), sekizlik (octal). Bu yazıda onluk, ikilik ve onaltılık sayı sistemlerini birbirine çevirecek python programı üzerinde çalışma yapacağız. Öncelikle programın parçalarını oluşturup çevrim için gerekli temel sistemi anlattıktan sonra bir bütün olarak grafik arayüzü olan bir program hazırlayacağız.

Aşağıda verilen bütün programlarda değişkenler harf sırasına göre ihtiyaç duyulduğu kadar kullanılmıştır. Kullanılan değişkenlerin isimlendirmesine özen gösterilmemiş, anlaşılırlığına dikkat edilmiştir.

Onluk (decimal) sayıyı ikilik (binary) sayıya çevirmek:

Onluk sayı sistemi günlük hayatta kullanılan ve işlemlerin yapıldığı sistemdir. Tabanı 10'dur. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 rakamları ile ifade edilir.

İkilik sayı sistemi genellikle bilgisayar ve dijital elektronik alanında kullanılmaktadır. Tabanı 2'dir. 0 ve 1 rakamları ile ifade edilr. Ayrıca dijital konularda "Low" ve "High" ifadeleri de sonuç açısından kullanılmaktadır.

onluk sayılari ikilik sayılara çevirmek için bölme 2 metodu kullanılır ve sonuç tersinden yazılır. 13 ondalık sayısını ikilik sayıya çevirelim:

Bölünen     Bölüm        Kalan
-------    -------      -------
13/2          6           1
6/2           3           0
3/2           1           1
1/2           0           1

Kalanlar tersten yazıldığında "1101" sonucuna ulaşılır. Bu sonuç aranan ikilik sayı değeridir. Biz aynı yöntemi kullanarak pythonda bu işlemi yapacağız. Program dosyası python konsolu üzerinde çalışmakta olduğundan Idle'yi kullanınız. Idle'de program dosyasını açtıktan sonra ">Run>Run Module F5" ile veya direk F5 tuşuna basarak çalışır.

#!/usr/bin/python
# -*- coding: utf8 -*-
# mehmet.yilmaz@teknomerkez.net

a=raw_input("Ondalık (decimal) sayıyı giriniz: ")
a=int(a) # girilen degeri sayiya ceviriyoruz
f="" # kalanlari toplayacagimiz degiskene (bos) deger atiyoruz
print "Girdiğiniz sayı: ", a # girilen sayi gosteriliyor
while a>0: # 0'a ulasincaya kadar bolme islemi yapilacak
    b=a/2  # girilen sayi 2'ye bolunup b degiskenine ataniyor
    print "2'ye bölünen değer: ", b
    c=b+b  # farki bulmak icin girilen sayiya ulasilmaya calisiliyor
    print "2'ye bölünen sayının sonuçları toplandı: ", c
    d=a-c  # fark bulunuyor
    print "kalan: ", d  # cikan fark gosteriliyor
    e=str(d) # fark sayidan karaktere cevriliyor
    a=b    # bolum girilen sayi olarak ataniyor
    f=e+f  # kalanlar bir araya getiriliyor
    print "kalanlar: ", f  # kalanlar gosteriliyor
print "İkilik (Binary) Sayı: ", f

Önce girilen sayı 2'ye bölünüyor. Kalanı bulmak için bölüm kendisi ile toplanıyor ve girilen sayıdan çıkarılarak kalan bulunuyor. İşlem ilerledikçe kalanlar tersinden biriktiriliyor. İşlemin sonucunu görmek için tıklayınız. Programın şıkıştırılmış dosyasını indirmek için tıklayınız. Program sadeleştirilmiş olarak yazılacak olursa:

#!/usr/bin/python
# -*- coding: utf8 -*-
# mehmet.yilmaz@teknomerkez.net

a=raw_input("Ondalık (decimal) sayıyı giriniz: ")
a=int(a)
f=""
while a>0:
    b=a/2
    c=b+b
    d=a-c
    e=str(d)
    a=b
    f=e+f
print "İkilik (binary) sayı: ", f

İşlemin sonucunu görmek için tıklayınız. Programın şıkıştırılmış dosyasını indirmek için tıklayınız.

İkilik (binary) sayıyı ondalık (decimal) sayıya çevirmek

Bir ikilik sayının yazılışının her hanesini 2'nin kuvveti (üssü) ile çarparak ondalık sayı elde edilir. Örnek:

1101 = 1*23 + 1*22 + 0*21 + 1*20

1101 = 1*8 + 1*4 + 0*2 + 1*1 = 8 + 4 + 0 + 1 = 13
Aynı işlem python ile de çok rahat yapılır:
#!/usr/bin/python
# -*- coding: utf8 -*-
# mehmet.yilmaz@teknomerkez.net

sonu=0
a=raw_input("Binary (ikilik) sayıyı giriniz: ")
b=len(a)
say=b
print "eleman sayısı: ",b
print "liste halinde sayilar: ", a
print "=== ISLEM BASI ==="
for c in a:
    print "string değer: ", c
    print "integer değer: ", int(c)
    say=say-1
    print "2'nin üssü olarak carpilacak: ", say
    print "2'nin üssü ile carpilan: ", 2**say
    son=int(c)*2**say
    print "son: ",son
    sonu=sonu+son
    print "gelinen sonuç: ",sonu
    print "------"
print "=== ISLEM SONU ==="
print "Decimal (onluk) deger: ",sonu

İşlemin sonucunu görmek için tıklayınız. Programın şıkıştırılmış dosyasını indirmek için tıklayınız. Programda sadeleştirme yapılacak olunursa:

#!/usr/bin/python
# -*- coding: utf8 -*-
# mehmet.yilmaz@teknomerkez.net

sonu=0
a=raw_input("Binary (ikilik) sayıyı giriniz: ")
b=len(a)
say=b
for c in a:
    say=say-1
    son=int(c)*2**say
    sonu=sonu+son
print "Decimal (onluk) deger: ",sonu

İşlemin sonucunu görmek için tıklayınız. Programın şıkıştırılmış dosyasını indirmek için tıklayınız. Burada verilen örnek programda binary dışında sayı girilgiğinde işlem yapmaktadır. Bu durum aslında bir hatalı çalışma şeklidir ve çalışmasında hata vardır. Bilgilendirme amaçlı olması ve kısaca izah yapılması amaçlandığından bu hata gözardı edilmiştir. Programın kendisinde ise bu hata düzeltilmiştir.

Diğer çevrimler:

Diğer çevrimler kodlarla basit olarak yapıldığından sadece kaynak kodları verilecek, ayrıntısına girilmeyecektir.

Ondalık (decimal) sayıyı onaltılık (hexadecimal) sayıya çevirmek:

#!/usr/bin/python
# -*- coding: utf8 -*-

a=raw_input("Lütfen decimal sayı giriniz: ")
b=hex(int(a))
print "Hexadecimal sayı: ", b

İşlemin sonucu:

>>>  Decimal (ondalık) sayı giriniz: 13 Hexadecimal (onaltılık) sayı:  0xd >>> >>> 
Decimal (ondalık) sayı giriniz: 13
Hexadecimal (onaltılık) sayı:  0xd
>>>

Programın şıkıştırılmış dosyasını indirmek için tıklayınız.

Onaltılık (hexadecimal) sayıyı ondalık (decimal) sayıya çevirmek:

#!/usr/bin/python
# -*- coding: utf8 -*-

a=raw_input("Hexadecimal (onaltılık) sayı giriniz: ")
b=int(a, base=16)
print "Ondalık (decimal) sayı: ", b

İşlemin sonucu:

>>> 
Hexadecimal (onaltılık) sayı giriniz: d
Ondalık (decimal) sayı:  13
>>> 

Programın şıkıştırılmış dosyasını indirmek için tıklayınız.

Onaltılık (hexadecimal) sayıyı binary (ikilik) sayıya çevirmek:

Bu işlem, temel olarak onaltılık sayıyı onluk sayıya, çıkan onluk sonucu da ikilik sonuca çevirme işlemidir.

#!/usr/bin/python
# -*- coding: utf8 -*-

a=raw_input("Hexadecimal (onaltılık) sayıyı giriniz: ")
a=int(a, base=16)
f=""
while a>0:
    b=a/2
    c=b+b
    d=a-c
    e=str(d)
    a=b
    f=e+f
print "İkilik (binary) sayı: ", f

İşlemin sonucu:

>>> 
Hexadecimal (onaltılık) sayıyı giriniz: d
İkilik (binary) sayı:  1101
>>> 

Programın şıkıştırılmış dosyasını indirmek için tıklayınız.

Binary (ikilik) sayıyı onaltılık (hexadecimal) sayıya çevirmek:

Bu işlemi temel olarak şöyle gerçekleştiriyoruz. Önce ikilik sayıyı onluk sayıya çeviriyor, çıkan onluk sonucu onaltılık sayıya çeviriyoruz.

#!/usr/bin/python
# -*- coding: utf8 -*-

sonu=0
a=raw_input("Binary (ikilik) sayıyı giriniz: ")
b=len(a) # eleman sayisini buluyoruz
say=b # eleman sayisi
for c in a:
    say=say-1
    sonu=sonu+(int(c)*(2**say))
    sonuc=hex(sonu)
print "Hexadecimal (onaltılık) değer: ",sonuc
İşlemin sonucu:
>>> 
Binary (ikilik) sayıyı giriniz: 1101
Hexadecimal (onaltılık) değer:  0xd
>>>

Programın şıkıştırılmış dosyasını indirmek için tıklayınız. Burada verilen örnekte yine Binary'den Decimale çevrimde olan hata oluşmakta, programda binary dışında sayı girilgiğinde işlem yapmaktadır. Bu durum aslında bir hatalı çalışma şeklidir ve çalışmasında hata vardır. Bilgilendirme amaçlı olması ve kısaca izah yapılması amaçlandığından bu hata gözardı edilmiştir. Programın kendisinde ise bu hata düzeltilmiştir.

Programın tasarımı ve inşası:

Buraya kadar anlatılanlar, temel Python işlemleri olarak programın parçalarını oluşturmaktadır. Bu parçalar birleştirilerek ve bir bütün olarak kullanıma hazır hale getirilmiştir. Arayüz için Python ile tümleşik olarak gelen Tkinter'i kullanılmıştır. Sade, kullanışlı ve anlatım açısından yeterli olmasına özen gösterilmiştir. Program hem Linux, hem de Windows işletim sistemlerinde hiç bir değişiklik yapmadan çalışmaktadır. Windows'ta çalışırken arka planda konsolun ayrı bir pencere olarak görünmemesi için programın adındaki "sayicevir.py" olan uzantısı "sayicevir.pyw" olarak değiştirilmelidir.

Resim 1: Programın çalışmasından bir görüntü.

Programa ait kod dosyasını sıkıştırılmış dosya olarak indirmek için tıklayınız.

Devrenin Programı:

#!/usr/bin/python
# -*- coding: utf8 -*-
# mehmet.yilmaz@teknomerkez.net

import sys
from Tkinter import *

def hakkinda():
    ekranyazi.set("Hazırlayan: mehmet.yilmaz@teknomerkez.net")
    ekran.config(textvariable=ekranyazi, font=("bold", 10), bg="#004040", fg="white", justify=CENTER)
    gekran.config(text="", font=("normal", 8))
def yardim():
    ekranyazi.set("Yardım için www.teknomerkez.net sitesine bakınız")
    ekran.config(textvariable=ekranyazi, font=("bold", 10), bg="#004040", fg="white", justify=CENTER)
    gekran.config(text="", font=("normal", 8))
def yeni():
    ekranyazi.set("Yeni bir sayıyı çevirmek için hazır")
    ekran.config(textvariable=ekranyazi, font=("bold", 12), bg="#004040", fg="white", justify=CENTER)
    girisyazi.set("")
    giris.config(textvariable=girisyazi, font=("bold", 14), bg="white", fg="black", justify=RIGHT)
    gekran.config(text="", font=("normal", 8))
def decbin():
    try: # sayi girilmisse (hata incelemesi yapiliyor, hata yoksa)
        a=giris.get() # kutulardaki bilgiler çagriliyor
        a=int(a)
        f=""
        while a>0:
            b=a/2
            c=b+b
            d=a-c
            e=str(d)
            a=b
            f=e+f
        ekranyazi.set(f)
        ekran.config(textvariable=ekranyazi, font=("bold", 18), bg="#004040", fg="red", justify=CENTER)
    except: #sayi disinda karakter girilmis ve islem yapılamıyorsa          
        ekranyazi.set("Hatalı giriş yaptınız, kontrol ediniz!")
        ekran.config(textvariable=ekranyazi, font=("bold", 12), bg="red", fg="white", justify=CENTER)
    gekran.config(text="Decimal'den Binary'e", font=("normal", 8))
def bindec():
    try: # sayi girilmisse (hata incelemesi yapiliyor, hata yoksa)
        a=giris.get() # kutulardaki bilgiler çagriliyor
        uyari="hatayok"
        sonu=0
        sonu2=""
        b=len(a) # eleman sayisini buluyoruz
        if b==0:
            ekranyazi.set("Hatalı giriş yaptınız, kontrol ediniz!")
            ekran.config(textvariable=ekranyazi, font=("bold", 12), bg="red", fg="white", justify=CENTER)
        else:
            for d in a:
                dd=int(d)
                if dd>1:
                    uyari="hata"
                if dd<2 and uyari<>"hata":
                    b=b-1
                    sonu=sonu+(int(d)*(2**b))
                    sonu2=str(sonu)
            if uyari=="hata":
                ekranyazi.set("Hatalı giriş yaptınız, kontrol ediniz!")
                ekran.config(textvariable=ekranyazi, font=("bold", 12), bg="red", fg="white", justify=CENTER)
            else:
                ekranyazi.set(sonu2)
                ekran.config(textvariable=ekranyazi, font=("bold", 18), bg="#004040", fg="red", justify=CENTER)
    except: #sayi disinda karakter girilmis ve islem yapılamıyorsa          
        ekranyazi.set("Hatalı giriş yaptınız, kontrol ediniz!")
        ekran.config(textvariable=ekranyazi, font=("bold", 12), bg="red", fg="white", justify=CENTER)
    gekran.config(text="Binary'den Decimal'e", font=("normal", 8))
def dechex():
    try: # sayi girilmisse (hata incelemesi yapiliyor, hata yoksa)
        a=giris.get() # kutulardaki bilgiler çagriliyor
        b=hex(int(a))
        ekranyazi.set(b)
        ekran.config(textvariable=ekranyazi, font=("bold", 18), bg="#004040", fg="red", justify=CENTER)
    except: #sayi disinda karakter girilmis ve islem yapılamıyorsa          
        ekranyazi.set("Hatalı giriş yaptınız, kontrol ediniz!")
        ekran.config(textvariable=ekranyazi, font=("bold", 12), bg="red", fg="white", justify=CENTER)
    gekran.config(text="Decimal'den Hexadecimal'e", font=("normal", 8))
def hexdec():
    try: # sayi girilmisse (hata incelemesi yapiliyor, hata yoksa)
        a=giris.get() # kutulardaki bilgiler çagriliyor
        b=int(a, base=16)
        ekranyazi.set(b)
        ekran.config(textvariable=ekranyazi, font=("bold", 18), bg="#004040", fg="red", justify=CENTER)
    except: #sayi disinda karakter girilmis ve islem yapılamıyorsa          
        ekranyazi.set("Hatalı giriş yaptınız, kontrol ediniz!")
        ekran.config(textvariable=ekranyazi, font=("bold", 12), bg="red", fg="white", justify=CENTER)
    gekran.config(text="Hexadecimal'den Decimal'e", font=("normal", 8))
def binhex():
    try: # sayi girilmisse (hata incelemesi yapiliyor, hata yoksa)
        a=giris.get() # kutulardaki bilgiler çagriliyor
        uyari="hatayok"
        sonu=0
        sonu2=""
        b=len(a) # eleman sayisini buluyoruz
        if b==0:
            ekranyazi.set("Hatalı giriş yaptınız, kontrol ediniz!")
            ekran.config(textvariable=ekranyazi, font=("bold", 12), bg="red", fg="white", justify=CENTER)
        else:
            for d in a:
                dd=int(d)
                if dd>1:
                    uyari="hata"
                if dd<2 and uyari<>"hata":
                    b=b-1
                    sonu=sonu+(int(d)*(2**b))
                    sonuc=str(hex(sonu))
            if uyari=="hata":
                ekranyazi.set("Hatalı giriş yaptınız, kontrol ediniz!")
                ekran.config(textvariable=ekranyazi, font=("bold", 12), bg="red", fg="white", justify=CENTER)
            else:
                ekranyazi.set(sonuc)
                ekran.config(textvariable=ekranyazi, font=("bold", 18), bg="#004040", fg="red", justify=CENTER)
    except: #sayi disinda karakter girilmis ve islem yapılamıyorsa          
        ekranyazi.set("Hatalı giriş yaptınız, kontrol ediniz!")
        ekran.config(textvariable=ekranyazi, font=("bold", 12), bg="red", fg="white", justify=CENTER)
    gekran.config(text="Binary'den Hexadecimal'e", font=("normal", 8))
def hexbin():
    try: # sayi girilmisse (hata incelemesi yapiliyor, hata yoksa)
        a=giris.get() # kutulardaki bilgiler çagriliyor
        a=int(a, base=16)
        f=""
        while a>0:
            b=a/2
            c=b+b
            d=a-c
            e=str(d)
            a=b
            f=e+f
        ekranyazi.set(f)
        ekran.config(textvariable=ekranyazi, font=("bold", 18), bg="#004040", fg="red", justify=CENTER)
    except: #sayi disinda karakter girilmis ve islem yapılamıyorsa          
        ekranyazi.set("Hatalı giriş yaptınız, kontrol ediniz!")
        ekran.config(textvariable=ekranyazi, font=("bold", 12), bg="red", fg="white", justify=CENTER)
    gekran.config(text="Hexadecimal'den Binary'e", font=("normal", 8))

pencere=Tk()
pencere.title("Sayı sistemlerini birbirine çevirici") # pencere basligi
pencere.geometry("400x200") # pencere boyutlari
ekranyazi=StringVar()
girisyazi=StringVar()

# Ekran (islem sonuclarinin ve uyarılarin kullaniciya aktarildigi alan)
ekranvarsayilan="Yeni bir sayıyı çevirmek için hazır"
ekranyazi.set(ekranvarsayilan)
ekran=Entry()
ekran.config(textvariable=ekranyazi, font=("bold", 12), bg="#004040", fg="white", justify=CENTER)
ekran.place(x=10,y=10,width=380,height=40)
# gorev ekrani
gekran=Label()
gekran.config(text="", font=("normal", 8))
gekran.place(x=10, y=110)

# sayi girisi
giris=Entry()
giris.config(font=("bold", 14), bg="white", fg="black", justify=RIGHT)
giris.place(x=10,y=60,width=200, heigh=35)

# islem yapma amacli dugmeler
Button(text="Yeni", command=yeni, font=("bold", 10)).place(x=190, y=160, width=80, height=30)
Button(text="Dec/Bin", command=decbin, font=("bold", 10), bg="#E1F2F7").place(x=230, y=60, width=80, height=30)
Button(text="Bin/Dec", command=bindec, font=("bold", 10), bg="#E1F2F7").place(x=310, y=60, width=80, height=30)
Button(text="Dec/Hex", command=dechex, font=("bold", 10), bg="#E1F2F7").place(x=230, y=93, width=80, height=30)
Button(text="Hex/Dec", command=hexdec, font=("bold", 10), bg="#E1F2F7").place(x=310, y=93, width=80, height=30)
Button(text="Hex/Bin", command=hexbin, font=("bold", 10), bg="#E1F2F7").place(x=230, y=125, width=80, height=30)
Button(text="Bin/Hex", command=binhex, font=("bold", 10), bg="#E1F2F7").place(x=310, y=125, width=80, height=30)

# Bilgilendirme amacli dugmeler
Button(text="Hakkında", command=hakkinda, font=("bold", 10)).place(x=10, y=160, width=80, height=30)
Button(text="Yardım", command=yardim, font=("bold", 10)).place(x=100, y=160, width=80, height=30)
Button(text="Çıkış", command=sys.exit, font=("bold", 12), bg="#FFCCFF").place(x=330, y=160, width=60, height=30)

pencere.mainloop()

Adana'da dünyaya geldi. Televizyon tamirciliğınde çırak olarak erken dönemde iş hayatına başladı. Daha sonraları Adana ve Ankara'da imalat, bilgisayar ve danışmanlık sektöründe iş hayatına devam etti. Şu anda kendisine ait işyerinde çalışmalarına devam etmektedir.
Web adresi: www.teknimer.com
E-posta: mehmet@teknimer.com
İçerik Yan Blok
Konular
Tasarım: Teknimer Teknoloji
Yukarı