Bu yazımda sizlere BitArray sınıfının kullanımı ve tanımı hakkında bilgiler vereceğim. Bunu yaparken de C# a yeni başlayanlar için indeksleyiciler ve özellikler kavramına da bir göz kırpacağız. BitArray sınıfı, adından da anlaşıldığı gibi bitlerden oluşan bir koleksiyondur. Bitler bilgisayar dünyasının temelini oluşturduğu ve bu bağlamda hayati bir önem taşıdığı için bir çok uygulamamızda kullanabileceğimiz çok faydalı bir sınıftır. Birden fazla kurucusu mevcuttur isterseniz önce bunlara değinelim.

Constructors (Kurucular) Açıklama
public BitArray(bool[] bims) Burada boolean türündeki dizimiz aynen BitArray koleksiyonumuzun elemanları olur.
public BitArray(byte[] bims) Byte türünden dizimizin uzunluğunun 4 olduğunu varsayarsak bims[0] ilk 8 biti bims[1],bims[2] ve bims[3] sırasıyla diğer 8 bitleri temsil eder. Sonuç olarak 32 biti koleksiyonumuzda barındırmış oluruz.
public BitArray(int[] bims) Aynen byte türünden dizi kabul eden kurucumuzdaki gibi aynı mantıkla çalışır bims[0] ilk 32 biti ve sırasıyla diğer 32 bitlik gruplar koleksiyonumuzun elemanı olarak karşımıza çıkar.
public BitArray(int boyut) Burada direkt olarak sınıfımız içindeki bitlerin sayısını belirleyebiliriz. Not: Ilk değer olarak false atandığını unutmamız gerekir.
public BitArray(int boyut,bool xyz) Burada ise direkt olarak boyutunu verdiğimiz gibi ikinci parametre oalrak verdiğimiz bool türünden değişken sayesinde sınıfımıza ilk değeri otomatik değil bizim kontrolümüz altında istediğimiz seçenek atanır. True veya False.
public BitArray(BitArray bims) bims sınıfımızdaki bitler aynen yeni oluşturduğumuz sınıfta da kullanılacaktır. Unutulmaması gereken bir değer kopyalanması olduğu ve referanslarının aynı olmadığıdır.

Kurucularımızı irdeledikten sonra bir uygulama için gerekli olan diğer silahlarımızı kuşanalım ve bunlarda bu sınıfa ait olan üyelerden metotlarımız olsun. Bildiğiniz gibi metotlar, kurucular, özellikler ve indeksleyiciler bir sınıfın vazgeçilmez araçlarıdır.

Yeni başlayanlar ve dah önceden C ile upraşanlar için Not: Metotların C deki karşılığının Fonksiyon olduğunu belirtmeden geçemeyeceğim aşağıdaki metotları eğer C biliyorsanız fonksiyon mantığıyla düşünmeniz işlerinizi eminim çok rahatlatacak. Yeni bir kavram ve C nin NYP(Nesne Yönelimli Programlama (Ingilizce deyimiyle OOP)) eklenmiş hali olarak görmeniz bir adım daha ileri gitmemiz için bir avantaj kazandırır.

Metodlar Kısa Örnek Açıklama
public BitArray And(BitArray isim) BitArray sınıfında kadir1 kadir2 kadir3 olsun.
kadir3=kadir2.And(kadir3);
kadir2 ile kadir3 bitsel ve ye sokulup kadir3 e atanıyor.
BitArray sınıfından isim adlı nesnenin bitlerine ve bu metodun üstünden kullanılan nesnenin bitlerine bitsel ve uygular ardından tekrar geri dönüş değeri olarak kullanır.
public BitArray Not() kadir3=kadir2.Not(); Fazla üstünde durmaya gerek yok sanırım. Üzerinden çağrılan BitArray sınıfını bitlerinin değilini alır ve geri dönüş değeri de bu sonuç içeren BitArray nesnesidir.
public BitArray Or(BitArray isim)   BitArray And() ten tek farkı bitsel ve yerine bitsel or yapmasıdır.
public BitArray Xor(BitArray isim)   Bu da bitsel Xor yapmaktadır kullanımı BitArray Or() veya And() ile aynıdır.
public bool Get(int indeks)
public void Set(int indeks,bool abc)
  Indeksleyicilerden ve özelliklerde kullanılan get ve set den pek de bir farkı olduğu söylenemez. Get metotumuz BitArray sınıfındaki belirttiğimiz indeks deki biti döndürür. Set ise aynen dediğim gibi indeksini belirttiğimiz bite abc değerini koyar.


Yeni Başlayanlara Için:

Makalemizde bahsedilen indeksleyicilerde veya özelliklerdeki Get ve Set in tanımı şöyleydi; en basit tanımıyla get değer döndürür ve set değer atar. Tabi ki çok daha kullanışlı olduğunu belirtmek isterim kısa bir indeksleyici örneği verirsek: dizi adında bir dizi tanımlandığı farzedilmiştir. value atanan değerdir.
 

public int this[indeks]
{
    get{ return dizi[indeks]; };
    set{ dizi[indeks]=value; };
}

Özellikleri gösteren küçük bir örnek: (deger isminde bir int tipinde alanımız olduğu farzedilmiştir.)

public int isim
{
    get{ return deger; }
    set{ deger=value; }
}

Indeksleyicilere ve özelliklere dair böyle bir noktada ufak bir örnek vermemenin tuzsuz bir çorba yapmaktan pek bir farkı olduğunu sanmıyorum. Indeksleyiciler ve özellikler nesne yönelimli programlama mantığının temellerinden biridir öyle ki nesne üzerinden en azından bir diziye bizim verdiğimiz kurallara göre değer atamak ve değer okumak işi kolaylaştıran bir unsurdur en iyisi örneğimizi verelim. Bu aşamada eminim indeksleyicilerin kullanımı size bir çok şey katacaktır. Örneğimiz:

using System;
using System.Text;

namespace indeksleyiciler
{
    class Program
    {
        static void Main(string[] args)
        {
            indexersinifi ind=new indexersinifi(10);
            Console.WriteLine("Özelliğimiz çalışıyor...");
            Console.WriteLine("Dizinin Boyu"+ind.boyut);

            Console.WriteLine("indeksleyici sayesinde sınıfımızın içindeki dizimiz doluyor...");
            for(int i=0;i<10;++i)
                ind[i]=(i+1)*2;
            Console.WriteLine("Get Eden Bölüm Çalışıyor ve sonuçlar...");
            for(int i=9;i>=0;--i)
                Console.WriteLine("Dizinin "+i+". elemanı "+ind[i]);
        }
    }
    class indexersinifi
    {
        int[] dizi;
   
        public indexersinifi(int aa)
        {
            dizi = new int[aa];
        }

        public int this[int index]
        {
            get{
                return dizi[index];
            }
            set{
                dizi[index]=value;
            }
        }
        public int boyut{
            get{
                return dizi.Length;
            }
        }
    }
}

Programımızın Çıktısı:  
 

Metodlar Açıklama
public void SetAll(bool abc) BitArray sınıfının içerdiği bütün bitlere abc değerini atar. Yukarıda anlatılan set mantığının tek bir bite değil sahip olduğu bütün bitlerine uygulanmış bir varyasyonudur. Bu sınıf içinde ayrıca bir indeksleyici ve bir özellik tanımlıdır (Ingilizce karşılıkları indexer ve properties dir).
object this[int indeks] { get; set; }
ve
public int Length { get; set; }
Not: BitArray, ICollection IEnumerable uygular ve IClonable’ı destekler.

Arayüzlere bu makalemde değinmiyorum. Kısaca teknik özelliklerinden bahsedersek interface anahtar kelimesi ile belirtilir. Metot imzalarını taşır ve sınıflar kalıtım yoluyla bir yada birden fazla arayüz alabilir. C# da eksik olan çoklu kalıtımın bir nevi değişik şekillerden gerçekleştirilmesidir. Bu bilgiler ışığında oluşturulmuş olan C# örneğimiz:

using System;
using System.Collections;

class Program
{
    static void Main(string[] args)
    {
        byte[] bKadir ={ 67 };
        bool[] bKadir2={true,false,false,true,true,false,true,false};
        BitArray BBitler1 = new BitArray(bKadir2);
        BitArray BBitler2 = new BitArray(8, false);
        BitArray BBitler3 = new BitArray(bKadir);
        BBitler2 = BBitler2.Xor(BBitler3);
        BBitler3=BBitler3.Or(BBitler1);
        BitArray BBitler = new BitArray(BBitler2.Not());

        //indeksleyicinin kullanımı
        BBitler3[1] = false;

        BBitler2.SetAll(true);
        Console.WriteLine("BBitler in son degeri");
        foreach (bool xyz in BBitler)
            Console.Write(xyz + " ");
        Console.WriteLine();
        Console.WriteLine("BBitler1 in son degeri");
        foreach (bool xyz in BBitler1)
            Console.Write(xyz + " ");
        Console.WriteLine();
        Console.WriteLine("BBitler2 in son degeri");
        foreach (bool xyz in BBitler2)
            Console.Write(xyz + " ");
        Console.WriteLine();
        Console.WriteLine("BBitler3 in son degeri");
        foreach (bool xyz in BBitler3)
            Console.Write(xyz + " ");
        Console.WriteLine();
        Console.WriteLine("BBitler in uzunluğu "+BBitler.Length);
        Console.WriteLine("BBitler1 in uzunluğu "+BBitler1.Length);
        Console.WriteLine("BBitler2 in uzunluğu "+BBitler2.Length);
        Console.WriteLine("BBitler3 in uzunluğu "+BBitler3.Length);    
    }
}

Çıktımız ise şöyledir: 

Başka bir uygulama olarak int[] dizisi ile bir BitArray sınıfı canlandıralım:

using System;
using System.Collections;

class Program
{
    static void Main(string[] args)
    {

        int[] bKadir ={ 960167 };
        BitArray BBitler1 = new BitArray(bKadir);
        BitArray BBitler2=new BitArray(bKadir);
        BBitler1.Not();
        BBitler2.SetAll(true);
        Console.WriteLine("BBitler1 in son degeri");
        foreach (bool xyz in BBitler1)
            Console.Write(xyz + " ");
        Console.WriteLine();
        Console.WriteLine("BBitler2 in son degeri");
        foreach (bool xyz in BBitler2)
            Console.Write(xyz + " ");

        Console.WriteLine();
        Console.WriteLine("BBitler1 in uzunluğu "+BBitler1.Length);
        Console.WriteLine("BBitler2 in uzunluğu "+BBitler2.Length);
    }
}

Çıktımız ise şöyle: 

Gördüğünüz gibi hemen hemen bütün metotları, indeksleyicileri ve özellikleri kullanarak kompleks bir BitArray sınıfı uygulaması yaptık. Kurucu metotların değişik varyasyonlarını da rahatlıkla deneyebilirsiniz. C# ın ve Visual Studio.NET in .Net Framework gibi bir bileşenler yumağıyla oluşturduğu çıkış ve desteklediği geniş çaplı ve yapılabilir hemen hemen her şey sayesinde uygulayabileceğiniz her türlü alt seviyeli programlama içinde uygun bir sınıf. Bana kalırsa robotik deneylerinin de bir nevi vazgeçilmezi.

Değişik kalıplar bulup BitArray dizisinin metotlarını kullanarak ilginç sonuçlar elde edebilirsiniz. C# ın hissettiğine inanmıyorum yani şu intellisense olayına çünkü asıl hisseden sizlersiniz ve bu kalıpları bulup kullanırsanız yapacağınız işlemler o kadar kompleks olacaktır. Unutmayın programlama dilleri ve bu yazıyı okuduğunuza göre C# sizin için ana diliniz gibi olmalıdır. 1 ve 0 mantığı her zaman işe yaramaktadır düşünsenize programcı mantığıyla bir 0 dan 1 elde etmek isteseniz yapacağınız şey bir 0’ın içinde kaç tane 0 olduğunu saymaktır. O halde bu BitArray sınıfının önemini kavramak da bizim için zor olmasa gerek. Siz bir adım öne gidin ve çeşitli atraksiyonlarını uygulayın. Yaptığınız programları da mail adresime yollayabilirsiniz. Herhangi bir soru ve yorum için inhoftec@gmail.com adresinden bana ulaşabilirsiniz.

Yazan: Volkan Atasever