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 bakabilirsiniz. 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() metodunun 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çermektedir. İ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ğladı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
numaralandığı 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 koleksiyonunda
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örebilirsiniz. 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); |
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); IEnumerator Liste; |
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.