Bitsel OperaC'deki tor'lar: AND, OR, XOR, Shift & Tamamlayıcı

Bitwise Nedir? Operators mu?

Bitsel Operaları bit düzeyinde veriyi işlemek için kullanılır, ayrıca bit düzeyinde programlama olarak da adlandırılır. Bit düzeyinde programlama, bir veya daha fazla bit deseni veya ikili sayı üzerinde, bunların bireysel bitleri düzeyinde işlem yapar. Sayısal hesaplamalarda hesaplama sürecini hızlandırmak için kullanılırlar.

Aşağıda 'C' programlama dilinin sağladığı bitsel operatörlerin listesi yer almaktadır:

Kullanım anlam
& Bit düzeyinde VE operatörü
| Bitsel VEYA operatörü
^ Bit düzeyinde özel VEYA operatörü
~ İkili Bir'in Tamamlayıcısı Operator bir tekli operatördür
<< Sola kaydırma operatörü
>> Sağa kaydırma operatörü

Bitsel operatörler, float, double vb. gibi ilkel veri tiplerine doğrudan uygulanamaz. Bitsel operatörlerin çoğunlukla tamsayı veri tipiyle uyumluluğu nedeniyle kullanıldığını her zaman hatırlayın.

Bitsel mantıksal operatörler, en az anlamlı bit olan LSB bitinden (en sağdaki bit) başlayarak, en soldaki MSB (En Anlamlı Bit) bitine doğru, bit bit veriler üzerinde çalışır.

Bitsel mantıksal operatörlerin hesaplanmasının sonucu aşağıdaki tabloda gösterilmektedir.

x y x ve y x | orada x^y
0 0 0 0 0
0 1 0 1 1
1 0 0 1 1
1 1 1 1 0

Bitsel VE

Bu, en yaygın kullanılan mantıksal bit düzeyindeki operatörlerden biridir. Tek bir ve işareti (&) ile gösterilir. (&) operatörünün her iki tarafına iki tamsayı ifadesi yazılır.
Bitsel VE işleminin sonucu, her iki bitin değeri 1 ise 1'dir; aksi takdirde sonuç her zaman 0'dır.

Aşağıdaki gibi değerlere sahip op2 ve op1 değişkenlerimizin olduğunu varsayalım:

Op1 = 0000 1101
Op2 = 0001 1001

Op1 ve op2 değişkenleri üzerindeki AND işleminin sonucu şu şekilde olacaktır:

Result = 0000 1001

Gördüğümüz gibi iki değişken parça parça karşılaştırılıyor. Her iki değişkendeki bir bitin değeri 1 olduğunda sonuç 1 veya 0 olacaktır.

Bit tabanlı VEYA

Tek bir dikey çubuk işaretiyle (|) temsil edilir. (|) operatörünün her iki tarafına iki tamsayı ifadesi yazılır.

Bitsel VEYA işleminin sonucu, ifadelerden en az birinin değeri 1 ise 1'dir; aksi takdirde sonuç her zaman 0'dır.

Aşağıdaki gibi değerlere sahip op2 ve op1 değişkenlerimizin olduğunu varsayalım:

Op1 = 0000 1101
Op2 = 0001 1001

Op1 ve op2 değişkenleri üzerinde OR işleminin sonucu şu şekilde olacaktır:

Result = 0001 1101

Gördüğümüz gibi iki değişken parça parça karşılaştırılıyor. Değişkenlerden birindeki bir bitin değeri 1 olduğunda sonuç 1 veya 0 olacaktır.

Bitwise Özel VEYA

(^) simgesiyle temsil edilir. (^) operatörünün her iki tarafına iki tamsayı ifadesi yazılır.

Bitsel Exclusive-OR işleminin sonucu, ifadelerden yalnızca birinin değeri 1 ise 1'dir; aksi takdirde sonuç her zaman 0'dır.

Aşağıdaki gibi değerlere sahip op2 ve op1 değişkenlerimizin olduğunu varsayalım:

Op1 = 0000 1101
Op2 = 0001 1001

Op1 ve op2 değişkenleri üzerindeki XOR işleminin sonucu şu şekilde olacaktır:

Result = 0001 0100

Gördüğümüz gibi iki değişken parça parça karşılaştırılıyor. Yalnızca bir değişken 1 değerini tuttuğunda sonuç 0 olur, aksi halde sonuç 0 olur.

Bitsel mantıksal operatörleri gösteren basit bir program yazalım.

#include <stdio.h>
int main() 
{
int a = 20;	/* 20 = 010100 */  
int b = 21;	/* 21 = 010101 */
int c = 0;           

c = a & b;       /* 20 = 010100 */ 
printf("AND - Value of c is %d\n", c );

c = a | b;       /* 21 = 010101 */
printf("OR - Value of c is %d\n", c );

c = a ^ b;       /* 1 = 0001 */
printf("Exclusive-OR - Value of c is %d\n", c );

getch();
}

Çıktı:

AND - Value of c is 20
OR - Value of c is 21
Exclusive-OR - Value of c is 1

Bit düzeyinde kaydırma operatörleri

Bitsel kaydırma operatörleri bit desenlerini sola veya sağa taşımak/kaydırmak için kullanılır. Sol ve sağ, ' tarafından sağlanan iki kaydırma operatörüdür.C' aşağıdaki gibi temsil edilir:

Operand << n (Left Shift)
Operand >> n (Right Shift)

Burada,

  • işlenen, üzerinde kaydırma işlemini gerçekleştirmemiz gereken bir tamsayı ifadesidir.
  • 'n', tamsayı ifadesinde kaydırmamız gereken bit konumlarının toplam sayısıdır.

Sola kaydırma işlemi 'n' bit sayısını sola kaydıracaktır. İfadede en soldaki bitler dışarı atılacak ve sağ tarafa 0 değerine sahip n bit doldurulacaktır.

Sağa kaydırma işlemi 'n' bit sayısını sağ tarafa kaydıracaktır. İfadede en sağdaki 'n' bitler dışarı atılacak ve sol tarafa 0 değeri doldurulacaktır.

Örnek: x, 1111 verisine sahip bir tamsayı ifadesidir. Kaydırma işlemi gerçekleştirildikten sonra sonuç şöyle olacaktır:

x << 2 (left shift) = 1111<<2 = 1100
x>>2 (right shift) = 1111>>2 = 0011

Shifts operatörleri birleştirilebilir, daha sonra tamsayı ifadesinden veri çıkarmak için kullanılabilir. Bitsel kaydırma operatörlerinin kullanımını gösteren bir program yazalım.

#include <stdio.h>
int main() {
int a = 20;	/* 20 = 010100 */  
int c = 0;           

c = a << 2;	/* 80 = 101000 */
printf("Left shift - Value of c is %d\n", c );

c = a >> 2;	/*05 = 000101 */
printf("Right shift - Value of c is %d\n", c );
return 0;
}

Çıktı:

Left shift - Value of c is 80
Right shift - Value of c is 5

Sola kaydırma işlemi yapıldıktan sonra değer, ikili karşılığı 80 olan 101000 olacaktır.

Sağa kaydırma işlemi yapıldıktan sonra değer ikili karşılığı 5 olan 000101 olacaktır.

Bit düzeyinde tamamlayıcı operatör

Bitsel tamamlayıcı, her zaman yalnızca bir değer veya bir işlenen aldığı için aynı zamanda birinin tamamlayıcısı operatörü olarak da adlandırılır. Tekli bir operatördür.

Herhangi bir bit üzerinde tamamlama işlemi uyguladığımızda, tüm 1'ler 0 olur ve bunun tersi de geçerlidir.

Eğer 0000 1111'i içeren bir tamsayı ifademiz varsa, bitsel tamamlama işlemi yapıldığında değer 1111 0000 olacaktır.

Bitsel tamamlayıcı operatör, tilda (~) sembolüyle gösterilir.

Bitsel tamamlayıcı operatörünün uygulanmasını gösteren bir program yazalım.

#include <stdio.h>
int main() {
int a = 10;	/* 10 = 1010 */  
int c = 0;           
c = ~(a);      
printf("Complement - Value of c is %d\n", c );
return 0;
}

Çıktı:

Complement - Value of c is -11

Şu ana kadar tartışılan tüm operatoların bir örneğini içeren başka bir program:

#include <stdio.h>
main() {
unsigned int x = 48;	/* 48 = 0011 0000 */  
unsigned int y = 13;	/* 13 = 0000 1101 */
int z = 0;           

z =x & y;       /* 0 = 0000 0000 */ 
printf("Bitwise AND Operator - x & y = %d\n", z );

z = x | y;       /* 61 = 0011 1101 */
printf("Bitwise OR Operator - x | y = %d\n", z );

z= x^y;       /* 61 = 0011 1101 */
printf("Bitwise XOR Operator- x^y= %d\n", z);

z = ~x;          /*-49 = 11001111 */
printf("Bitwise One's Complement Operator - ~x = %d\n", z);

z = x << 2;     /* 192 = 1100 0000 */
printf("Bitwise Left Shift Operator x << 2= %d\n", z );

z= x >> 2;     /* 12 = 0000 1100 */
printf ("Bitwise Right Shift Operator x >> 2= %d\n", z );}

Programı derleyip çalıştırdığımızda aşağıdaki sonucu elde ederiz:

Bitwise AND Operator - x & y = 0
Bitwise OR Operator - x | y = 61
Bitwise XOR Operator- x^y= 61
Bitwise One's Complement Operator - ~x = -49
Bitwise Left Shift Operator x << 2= 192
Bitwise Right Shift Operator x >> 2= 12

ÖZET

  • Bitsel operatörler 'C' tarafından sağlanan özel operatör kümesidir.
  • Bit düzeyinde programlamada kullanılırlar.
  • Bu operatörler bir tamsayı ifadesinin bitlerini değiştirmek için kullanılır.
  • Mantıksal, kaydırma ve tamamlayıcı olmak üzere üç tip bitsel operatör vardır.
  • Bitsel tamamlayıcı operatör, bir ifadenin bitlerini tersine çevirmek için kullanılır.