Konuyu Oyla:
  • Toplam: 0 Oy - Ortalama: 0
  • 1
  • 2
  • 3
  • 4
  • 5
   
Konu: C# - Bitsel Operatörler {22}
Hera
*
avatar
Yüzbaşı
Durum: Çevrimdışı
Seviye Puanı: 9
Yaşam Puanı: 42 / 201
Deneyim: 5 / 100
Rep Sayısı: 27
Mesaj Sayısı: 101
Üyelik Tarihi: 13.04.2019
     
Yorum: #1
C# - Bitsel Operatörler {22}
20.05.2019 19:39
Şimdiye kadar gösterdiğim bütün operatörler direkt nesneler üzerinde işlem yapan operatörlerdi. Bitsel operatörler sayıları bir bütün olarak ele almazlar. Sayıları oluşturan her bir üzerinde ayrı ayrı işlem yaparlar.
Bitsel işlemler yalnızca tam sayılar üzerinde yapılır. Gerçek sayılarla bitsel operatörler kullanılmaz.

Bitsel operatörler eğer bool türden operandlarla kullanılırsa mantıksal işlemler gerçekleşir. Eğer operandlar tam sayı türündense bitsel işlemler gerçekleşir. Yani aşağıdaki her iki ifade de aynı anlama gelmektedir.

bool b1 = false && false;
bool b1 = false & false;


Bitsel operatörlerden yalnızca ~ operatörü tek operand, diğerleri ise iki operand almaktadır. Bitsel operatörler genellikle bitlerin durumlarını öğrenmek, belirli bitler 0 yada 1 yapmak gibi alt seviye işlemlerde kullanılır.
Bu konuda bitsel operatöerlele ilgili işlemlerimizi bit sayısı az olduğu için byte türünden nesneler üzerinden gerçekleştireceğim.

~ (Bitsel Değil) Operatörü

Tek operand alan ~ operatörü bit seviyesinde Değil işlemi almaktadır. Yani 1 olan bitleri 0, 0 olan bitleride 1 yapmaktadır. Bu işleme kısaca tümleme denilmektedir.
Örneğin, byte türünden olan 01010101 sayısının gbitsel değili (tümleyeni) 10101010'dır. Bir sayının tümleyeni bulacak program aşağıdaki şekilde kodlanabilir;
Kod:
using System;

namespace C13
{
    class Program
    {
        static void Main()
        {
            byte b1 = 255;
            byte b2 = (byte)~b1;
            Console.WriteLine(b2);
        }
    }
}

Yukarıdaki programda ~b1 ifadesinin tür dönüştürme operatörü ile byte türüne dönüştürüldüğüne dikkat edin. Hatırlarsanız önceki konularımda byte türü ile yapılan aritmetik işlemleri int türünden değer ürettiğini söylemiştim. Bu kural bitsel operatörler için de aynen geçerlidir.

& (Bitsel Ve) Operatörü

'Bitsel Ve' operatörü operandların karşılıklı bitlerin 've(and)' işlemine tabi tutar. 'Bitsel Ve' işleminin operandlara göre doğruluk tablosu şöyledir;
'Bitsel Ve' operatörünün kullanımına bir örnek vereyim, aşağıdaki tanımlanan a ve b değişkenlerinin 'Bitsel Ve' işleminin sonucunda üretilecek değeri bulalım;

byte a = 145;
byte b = 73;
int c = (byte)(a & b);


Öncelikle bu iki sayının (a, b) bitsel ifadelerini yazalım:

1001 0001 >>> 145
0100 1001 >>> 73


Şimdi karşılıklı bitler üzerinde (&) işlemini yapalım:

1001 0001 >>> 145
0100 1001 >>> 73
0000 0001 >>> 1


Dolayısıyla c değişkenine 1 değeri atanacaktır.

'Bitsel Ve' Operatörü ile ilgili Önemli Özellikler

  1. Bir sayıyı bütün bitleri 1 olan bir sayı ile Bitsel Ve işlemine tabi tutmak sayının değerini değiştirmez. Çünkü bitsel işleminde 1 etkisiz elemandır. Aşağıdaki Örnekte a ve b değişkenlerinde aynı değer tutulmaktadır.

    byte a = 145;
    byte x = 255; // Bütün Bitleri 1 Olan sayı
    byte b = (byte)(a & x);
  2. Bir sayıyı bütün bitleri 0 olan bir sayı ile Bitsel Ve işlemine tabi tutma ksayının değerini 0 yapar. Çünkü Bitsel Ve işleminde, 0 yutan elemandır.
    Mesela 11 sayısının bütün bitlerini sıfırlayalım;

    byte a = 11;
    byte x = 0; // Bütün bitleri 0 olan sayı.
    byte b = (byte)(a & x);


| (Bitsel Veya) Operatörü

'Bitsel Veya' operatörü operandların karşılıklı bitlerini 'Veya (or)' işlemine tabi tutar. 'Bitsel Veya' işleminin oeprandlara göre doğruluk tablosu aşağıdaki gibidir;
'Bitsel Veya' operatörünün kullanımına bir örnek verelim, a ve b değişkenlerin 'Bitsel Veya' işlemin sonucunda üretilecek değeri bulalım;

byte a = 145;
byte b = 73;
int c = (byte)(a | b);


Öncelikle bu iki sayının bitsel ifadelerini yazalım:

1001 0001 >>> 145
0100 1001 >>> 73


Şimdi karşılıklı bitler üzerinde Veya işlemini yapalım:

1101 1001 >>> 217

Dolayısıyla c değişkenine 217 değeri atanacaktır.
Bitsel Veya operatörü genellikle bir sayının belirli bitlerini değiştirmeden bazı bitlerini değiştirmek için kullanılır.
Örnek : Aşağıdaki bit dizisindeki 1. biti 1, ikinci biti ve 5. biti 0 yapacak bir program yazalım. Not: 1, 2 ve 5. bitin dışındaki bitler aynı kalacaktır.

byte a >>> 1011 0010 (0xB2)

Çözüm : Bu sorunun çözümünde hem 'Bitsel Ve' hem de 'Bitsel Veya' opreratörleri kullanılacaktır. Bitsel Ve operatörünün yutma özelliğini kullanacağız. Öncelikle a sayısının uygun bir sayı ile Bitsel Ve işlemine tabi tutup 1,2 ve 5. bitleri sıfırlamalıyız. Bu uygun sayıya x diyelim. 1, 2 ve 3. bitlerin sıfırlanmış sayı aşağıdaki gibidir;

1010 0000

Bu işlemi yapacak uygun sayı ise 1, 2 ve 5. bitleri 0, diğer bitleri 1 olan sayıdır. Yani;

x >>> 1110 1100 (0xEC)

x sayısını x ile Bitsel Ve işlemine tabi tuttuğumuzda;

1010 0000

sayısını elde ederiz.
Bu işlemden sonra değinmek istediğim bitler bu sayı ile Bitsel Ve işlemine tabi tutarız. Yani: Bitsel Ve işlemine tabi tutacağımız sayının 1. biti 1, 2 ve 5. biti de 0 olacaktır. Diğer bitler ise 0 olarak kalacaktır.

1010 0000

sayısını

0000 0001 (0x1)

ile 'Bitsel Veya' işlemine tabi tutarsak;

1010 0001 >>> 161
Bu işlemi yapan program ise şöyledir;
Kod:
using System;

namespace C13
{
    class Program
    {
        static void Main()
        {
            byte a = 0xB2;
            byte b = (byte)(a & 0xEC | 0x1);
            Console.WriteLine(b);
        }
    }
}


^ (Bitsel Özel Veya) Operatörü

'Bitsel Özel Veya' operatörü operandların karşılıklı bitlerini 'özel Veya (XOR)' işlemine tabi tutar. 'Bitsel Özel Veya' işleminin operandlara göre doğruluk tablosu şöyeldir;
^ operatörünün 1 değerini üretmesi için oıpreandların farklı olması gerekir.

Özel Veya operatörünün işlem yapma mantığı diğer iki operatör ile aynı olduğu için örnek vermeyeceğim. Ancak Özel Veya operatörü ile ilgili bilinmesi gereken önemli bir nokta var. Özel Veya operatörü geri dönüşümlü işlem yapar . Yani bir sayıyı özel Veya işlemine tabi tuttuktan sonra aynı sayı ile tekrar Özel Veya işlemine tabi tutarsak başlangıçtaki sayıyı elde ederiz. Bu ifadeyi formül ile göstermek isterim;

x = c ^ b;
y = x ^ b;
ise
c = y'dir.

Bu işlemin gerçekten başarılı olduğunu görmek istiyorsanız bu programı derleyin.
Kod:
using System;

namespace C13
{
    class Program
    {
        static void Main()
        {
            byte b = 10;
            byte c = 99;
            Console.WriteLine("İlk değeri >> {0}", c);
            c = (byte)(c ^ b);
            Console.WriteLine("İlk XOR >> {0}", c);
            c = (byte)(c ^ b);
            Console.WriteLine("İkinci XOR >> {0}", c);
        }
    }
}


<< Bitsel Sola Kaydırma Operatörü

<< operatörü verilen bir sayının bitlerini istenilen sayı kadar sola ötelemek için kullanılır. İki operand almalıdır. Operatörün ürettiği değer bitlerin sola ötelenmiş halidir. Burada önemli olan ilk bit ve son bitin durumudur. İlk bit her zaman sıfırla beslenir. Son bit ise ötelemeden dolayı atılır.
<< operatörünün kullanımını göstereyim;

değişken << öteleme sayısı

<< operatörünün kullanımına bir örnek verecek olursak;

byte b = 0xB5 //1001 0101
byte c = (byte)(b << 1);


b değişkeni 1 defa ötelendiğinde

0010 1010

değeri türetilir. Görüldüğü gibi ilk bit sıfırlandı, son bit atıldı, diğer bitler ise birer adım sola kaydırıldı.

>> Bitsel Sağa Kaydırma Operatörü

>> Operatörü verilen bir sayının bitlerini istenile nsayı kadar sağa ötelemek için kullanılır << operatöründen tek farkı, >> operatörü de << operatörü gibi iki operand almalıdır. >> operatörünün ürettiği değer, bitlerin sağa ötelenmiş halidir. Bu sefer son bit her zama nsıfırla beslenir. İlk bit ise ötelemeden dolayı atılır.
Alinti
DARKDAYS
*
avatar
Albay
Durum: Çevrimdışı
Seviye Puanı: 30
Yaşam Puanı: 724 / 731
Deneyim: 25 / 100
Rep Sayısı: 459
Mesaj Sayısı: 1206
Üyelik Tarihi: 08.04.2017
      
Yorum: #2
RE: C# - Bitsel Operatörler {22}
21.05.2019 18:03
Teşekkürler, Emeğine Sağlık Smile

Parmak uçlarına bak, parmak izlerini görüceksin ve o izlerden ne önce, ne şimdi, ne daha sonra olucak.
Dünya üzerinde 150 Milyar insan yaşamış, biri o parmak izlerine sahip değil !

MİRROR
Alinti



1 Ziyaretçi