Hızlı Konu Açma

Hızlı Konu Açmak için tıklayınız.

Son Mesajlar

Konulardaki Son Mesajlar

Reklam

Forumda Reklam Vermek İçin Bize Ulaşın

BitArray Koleksiyonu

YaSa22

Fahri Üye
Fahri Üye
Katılım
12 Temmuz 2014
Mesajlar
2,293
Tepkime puanı
2
Puanları
0
Konum
GTA
Bildiğiniz gibi byte değişkenler bellekte 8 bit yer işgal etmektedir. Bu 8 bit 1’lerle doldurulduğunda değişkenin içeriği 255 olmaktadır. Benzer şekilde short değişkenler 16 bitliktir ve bu 16 bit 1’lerle doldurulduğu zaman değişkenin içeriği 65535 olabilmektedir. Söz konusu edilecek değişkenin bitleri ile ilgileniyorsanız BitArray sınıfından yararlanıp ilgili değişkenin bitlerinden bir dizi değişken veya koleksiyon hazırlayabilirsiniz. Bu konuda bilgi vermek için aşağıda verdiğim kodu hazırladım.

byte[] Dizi = new byte[1];
Dizi[0] = 255;
System.Collections.BitArray Bit_dizisi;
Bit_dizisi = new System.Collections.BitArray(Dizi);

Bu kodda önce 1 elemanlı byte tipinde bir dizi değişken tanımladım ve ilk elemanına 255 sayısını aktardım. Bu sayede byte tipindeki dizi değişken için ayrılan 8 bitin tümü 1 değerini içermiş oldu. Devamında System.Collections adlı Namespace’te yer alan BitArray sınıfı için değişken tanımlayıp BitArray nesnesi hazırladım. BitArray sınıfının yapıcı metoduna parametre olarak verdiğim Byte tipindeki dizi değişken yalnızca 1 elemana sahip olduğu için BitArray nesnesi toplam 8 elemana sahip olur. Bu dizi değişken 2 elemana sahip olsaydı BitArray nesnesi veya koleksiyonu 16 elemana sahip olurdu. BitArray koleksiyonun eleman sayısını öğrenmek istiyorsanız Count özelliğine baka+bilirsiniz. BitArray sınıfının yapıcı metodu bool, byte ve int tipinde dizi değişkenleri parametre olarak almaktadır. Daha önce 1 elemanlı bir byte dizisi hazırladığım için bu dizi değişkeni yapıcı metoda parametre olarak verdim. Bu hazırlıklardan sonra BitArray tipindeki dizi değişkenin veya koleksiyonun elemanları okunabilir. BitArray koleksiyonun elemanları okunurken Get() metodu kullanılmaktadır. Get() meto+dunun nasıl kullanıldığını anlatmak için forma 4 TextBox yerleştirdim ve yukarıda verdiğim satırlara ekleme yaptım.

private void Form1_Click(object sender, EventArgs e)
{
byte[] Dizi = new byte[1] ;
Dizi[0] = 255;
System.Collections.BitArray Bit_dizisi;
Bit_dizisi = new System.Collections.BitArray(Dizi);
textBox1.Text = Bit_dizisi.Get(0).ToString();
textBox2.Text = Bit_dizisi.Get(1).ToString();
textBox3.Text = Bit_dizisi.Get(2).ToString();
textBox4.Text = Bit_dizisi.Get(3).ToString();
}

Bu kod işletildiğinde TextBox’ların hepsine birden True bilgisi aktarılır. Çünkü Byte tipindeki dizi değişkenin ilk elemanına 255 aktardığım için bütün bit’ler 1 değerini içermek+tedir. İlgili bit 1 ise Get() metodu geriye True, 0 ise false göndermektedir. Dizi değişkenin ilk elemanına 255 yerine 10 sayısını aktarmış olsaydım bellekteki yerleşim aşağıdaki gibi olurdu.

0
0
0
0
1
0
1
0

Bu şartlarda yukarıdaki kod işletildiğinde ilk TextBox’a False, ikincisine True, üçüncüsüne yine false ve 4.cüye true bilgisi aktarılırdı. Aşağıda verilen ekran görüntüsünü Byte tipindeki dizi değişkenin ilk elemanına 10 sayısını aktarıp verdiğim kodu işlettikten sonra aldım.



Şimdi yukarıda verdiğim kodda değişiklik yapıp dizi değişkene aktarılmış olan sayının eksi olup olmadığını öğreneceğim. Dizi değişkenin int tipinde ve 4 elemana sahip olmasını sağla+dım. Bildiğiniz gibi int değişkenler bellekte 32 byte yer kaplamaktadır ve değişken eksi değer içeriyorsa sol taraftaki ilk byte 1, eksi değilse 0 sayısını içermektedir. Bu nedenle int tipindeki bir değişkene -10 sayısı aktarıldığında bellekteki yerleşim aşağıdaki gibi olur.

1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
1
0
31
30
29
28
27
27
25
24
23
23
21
20
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0

Buna göre int tipindeki dizi değişkenin ilk elemanın eksi değer içerip içermediğini öğrenmek için sağdan son bite veya soldan ilk bite bakmak gerekmektedir. Bu nedenle aşağıda verdi+ğim kodda sıra numarası 31, 63, 95 ve 127 olan bitleri araştırdım.Aşağıda verdiğim kodda int tipindeki dizi değişken toplam 4 elemana sahip olduğu için BitArray dizisi 32*4=128 elemanlı olur.

private void Form1_Click(object sender, EventArgs e)
{
int[] Dizi = new int[4] ;
Dizi[0] = -10;
Dizi[1] = 10;
Dizi[2] = -100;
Dizi[3] = 100;
System.Collections.BitArray Bit_dizisi;
Bit_dizisi = new System.Collections.BitArray(Dizi);
textBox1.Text = Bit_dizisi.Get(31).ToString();
textBox2.Text = Bit_dizisi.Get(63).ToString();
textBox3.Text = Bit_dizisi.Get(95).ToString();
textBox4.Text = Bit_dizisi.Get(127).ToString();
}

Bu kodda Get() metodu ile ilk olarak 32. elemanı(elamanlar 0’dan başlanarak numaralan+dığı için 31. elemanı parametre olarak verdim) okudum. Bu eleman -10 sayısını içeriği için “Bit.Get(31)” metodu geriye True bilgisini gönderir. Devamında bu kez 63. elemanı okudum. int tipindeki dizi değişkenin 2. elemanın temsil eden 32 bit BitArray koleksiyo+nunda 32’den başlayıp 63’te bitmektedir. Bu şartlarda bu kod işletildiğinde aşağıdaki gibi bir sonuç alınır.



Yukarıda BitArray() sınıfının yapıcı metoduna önce byte, sonra int tipinde dizi değişkeni parametre olarak verdik. Şimdi ise bool tipindeki bir dizi değişkeni parametre olarak verip BitArray nesnesi hazırlayacağım.

private void Form1_Click(object sender, EventArgs e)
{
bool[] Dizi = new bool[4] ;
Dizi[0] = false;
Dizi[1] = true;
Dizi[2] = false;
Dizi[3] = false;
System.Collections.BitArray Bit_dizisi;
Bit_dizisi = new System.Collections.BitArray(Dizi);
textBox1.Text = Bit_dizisi.Get(0).ToString();
textBox2.Text = Bit_dizisi.Get(1).ToString();
textBox3.Text = Bit_dizisi.Get(2).ToString();
textBox4.Text = Bit_dizisi.Get(3).ToString();
}

bool değişkenler bellekte 1 byte yer kapladıkları için bu kod ile hazırlanan BitArray nesnesi toplam 4 elemana sahip olur. Bu örnekte bool tipinde dizi değişken tanımladıktan sonra elemanlarına değer aktardım. Dizi değişkenin elemanlarına değer aktarmasaydım bütün elemanların false olduğu varsayılırdı. Yukarıda BitArray nesnesinin eleman sayısı yapıcı metoda parametre olarak verilen dizi değişkenin tipine ve eleman sayısına göre belirleniyordu. İsterseniz BitArray nesnesinin eleman sayısını kendiniz belirleyebilirsiniz. Bu işlemin nasıl yapıldığını aşağıda görebilirsiniz.

System.Collections.BitArray Bit_dizisi;
Bit_dizisi = new System.Collections.BitArray(8);

Bu 2 satır sayesinde 8 elemanlı bir BitArray nesnesi hazırlanmış olur ve başlangıçta bütün elemanlar false bilgisini içerir. Bu şekilde BitArray nesnesi hazırlarken yapıcı metoda 2. parametre olarak True bilgisini verirseniz bütün elemanların başlangıç içerikleri true olur.

System.Collections.BitArray Bit_dizisi;
Bit_dizisi = new System.Collections.BitArray(8, true);

SetAll() ve Set() Metotları

Herhangi bir teknikle hazırlamış olduğunuz BitArray nesnesinin elemanlarının içeriğini değiştirmek istiyorsanız Set() veya SetAll() metotlarından yararlanabilirsiniz. Bütün elemanların True olmasını istiyorsanız SetAll() metodunu aşağıdaki gibi kullanabilirsiniz.

Bit_dizisi.SetAll(true);

SetAll() metoduna parametre olarak false vermeniz halinde bütün elamanlar false olur. Bütün elemanları false veya true yapmak yerine istediğiniz elemanın içeriğinde ayarlama yapmak istiyorsanız Set() metodunu kullanmalısınız. Set() metodu 2 parametreye sahiptir. İlk parametrede içeriği değişecek elemanın sıra numarası, 2. parametrede ise söz konusu elemana aktarılmak istenen bilgi(true veya false) verilmektedir. Set() metodu aşağıdaki gibi kullanıldığında BitArray nesnesinin ilk elemanı true olur.

Bit_dizisi.Set(0, true);

BitArray nesnesinin elemanların bilgi aktarırken Set() metodu yerine elemanlara aşağıda yapıldığı gibi istediğiniz elemana true veya false bilgisini aktarabilirsiniz.

Bit_dizisi[0] = false;
Bit_dizisi[1] = true;

Not(), And() ve Or() Metotları

BitArray nesnesinin false olan elemanlarını true, true olanları ise false yapmak istiyorsanız Not() metodunu kullanabilirsiniz. Not() metodunun nasıl kullanıldığını aşağıda görebilirsi+niz. Bu kod işletildiğinde ilk TextBox’a true, ikincisine false yazılır. Çünkü Not() metodu kullanılmadan önce ilk eleman false, ikincisi ise true idi.

System.Collections.BitArray Bit_dizisi;
Bit_dizisi = new System.Collections.BitArray(2);
Bit_dizisi.Set(0, false);
Bit_dizisi.Set(1, true);
Bit_dizisi.Not();
textBox1.Text = Bit_dizisi.Get(0).ToString();
textBox2.Text = Bit_dizisi.Get(1).ToString();

And() metodu 2 BitArray nesnesinin elemanlarını bire bir karşılaştırıp And operatörünü uygular ve geriye başka bir BitArray nesnesi gönderir. Bu metot hakkında bilgi vermek için 3 adet BitArray nesnesi hazırladım ve ilkinin elemanlarına sırayla false, true, false, ikincinin elemanlarına ise Set() metodu ile false, true, true bilgilerini aktardım.

private void Form1_Click(object sender, EventArgs e)
{
System.Collections.BitArray Dizi_1, Dizi_2, Dizi_3;
Dizi_1 = new System.Collections.BitArray(3);
Dizi_2 = new System.Collections.BitArray(3);

Dizi_1.Set(0, false);
Dizi_1.Set(1, true);
Dizi_1.Set(2, false);
Dizi_2.Set(0, false);
Dizi_2.Set(1, true);
Dizi_2.Set(2, true);
}

Bu şekilde üçer elemanlı 2 BitArray nesnesi hazırlayıp elemanlarına bilgi aktardıktan sonra And() metodunu aşağıdaki gibi kullandım. BitArray() nesnesinin birisi And() metodunun soluna yazılmakta, diğeri parametre olarak verilmektedir. Bu işlemden sonra “Dizi_3” adını verdiğim BitArray nesnesinin elemanları sırayla false, true, false olur

Dizi_3 = Dizi_1.And(Dizi_2);

Bu örnekte And() yerine Or() metodunu kullanmış olsaydım metodun geriye gönderdiği BitArray nesnesinin elemanları sırayla False, True, True olurdu. BitArray sınıfının Nor, And, Or’dan başka ayrıca Xor() metodu da bulunmaktadır.

Dizi_3 = Dizi_1.Or(Dizi_2);

BitArray sınıfına IEnumerator arayüzü uygulandığı için GetEnumerator() metodu ile BitArray nesnesinin numaralı bir listesini hazırlayabilirsiniz. Bu konuda bilgi vermek için aşağıdaki gibi kod yazarak basit bir BitArray nesnesi hazırladım ve elemanlarını forma yerleş+tirmiş olduğum ListBox’a aktardım.

System.Collections.BitArray Dizi;
Dizi = new System.Collections.BitArray(4);

Dizi.Set(0, false);
Dizi.Set(1, true);
Dizi.Set(2, false);
Dizi.Set(3, false);

IEnumerator Liste;
Liste = Dizi.GetEnumerator();
for (; Liste.MoveNext(); )
listBox1.Items.Add(Liste.Current.ToString());

Burada BitArray nesnesini hazırlayıp elemanlarının içeriklerini ayarladıktan sonra IEnumerator tipinde bir değişken tanımlayıp GetEnumerator() metodu ile BitArray nesnesinin bütün elemanlarını IEnumerator koleksiyonuna. Devamında for döngüsü ile sıralı listeden okuma yaptım.
 

Users Who Are Viewing This Konu (Users: 0, Guests: 1)

Üst