Bitsel OperaC'deki tor'lar: AND, OR, XOR, Shift & Tamamlayıcı
⚡ Akıllı Özet
C dilindeki bit düzeyindeki operatörler, düşük seviyeli ve gömülü programlamada daha hızlı hesaplamalar yapmak, bayrakları paketlemek ve donanımı kontrol etmek için tamsayı işlenenler üzerinde AND, OR, XOR, tamamlayıcı ve kaydırma işlemleri kullanarak verileri tek tek bit düzeyinde manipüle eder.

Bitwise Nedir? Operators mu?
Bitsel OperaBit düzeyinde veri manipülasyonu için kullanılan bit tabanlı işlemlere bit düzeyinde programlama da denir. Bit tabanlı işlemler, bir veya daha fazla bit deseni veya ikili sayıyı, her birinin bit düzeyinde işler. 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ü |
Bit düzeyindeki operatörler, float, double gibi temel veri tiplerine doğrudan uygulanamaz. Bit düzeyindeki operatörlerin çoğunlukla şu durumlarda kullanıldığını her zaman hatırlayın: tamsayı veri türü uyumluluğu nedeniyle.
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
Bit düzeyinde kaydırma operatörleri, bit desenlerini sola veya sağa taşımak/kaydırmak için kullanılır. Sol ve sağ, 'C' dilinin sağladığı ve aşağıdaki gibi temsil edilen iki kaydırma operatörüdür:
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 ve daha sonra şu amaçla kullanılabilir:tracTamsayı ifadesinden gelen verileri alalım. Bit düzeyinde kaydırma operatörlerinin kullanımını göstermek için 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
İşte şimdiye kadar ele alınan tüm operatörlerin örneklerini 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
