Bit düzeyindeki operatörler, C diline düşük seviyeli verilerle ve donanımla çalışmayı kolaylaştırmak amacıyla eklenmiştir: kayıt ayarlama, maskeleme, 2'nin katlarına çarpma ve bölme. Bu operatörlerin çalışma kuralları, 8 ve 16 bitlik işlemciler döneminde oluşmuştur.
Sıklıkla signed türlerin kaydırılmasında hata yapılır çünkü sonuç, uygulanana (aritmetik veya mantıksal kaydırma) ve tür boyutunu aşma durumuna bağlıdır. Hatalar — veri bozulması, yanlış hesaplamalar, belirsiz davranışlar.
Sola kaydırma (<<): değerin 2 üzeri k ile çarpılmasının eşdeğeri (a << k). Her zaman sağdan sıfırlarla doldurur.
Sağa kaydırma (>>): unsigned değer için soldan sıfırlarla doldurur (mantıksal kaydırma), signed için ise ya işaret bitini ile doldurabilir (aritmetik kaydırma) ya da sıfırlarla (davranış derleyiciye bağlıdır).
Örnek:
unsigned int x = 5; // 0000 0101 unsigned int y = x << 1; // 0000 1010 == 10 int z = -4; // 1111 1100 (eğer 8 bit) int w = z >> 1; // 1111 1110 (-2) veya 0111 1110 (uygulamaya bağlı)
Ana özellikler:
Negatif bir sayıyı sağa >> kaydırırsak ne olur?
Sonuç, uygulamaya bağlıdır: genellikle işaretin korunması ile aritmetik kaydırma yapılır, ancak standart bunu garanti etmez!
Bit sayısı türün bit genişliğinden fazla olduğunda sonuç ne olur?
Undefined behavior. Örneğin, 1 << 32 32 bitlik tür için herhangi bir şey verebilir veya programın çalışmasını bozabilir.
Bit düzeyindeki operatörleri kayar noktalı sayılar için kullanabilir miyiz?
Hayır, standart türler float, double bit düzeyinde işlemleri desteklemez. Sadece tam sayı türleri ile.
Bir programcı, bir maske oluşturmak için int'i 32 bit kaydırdı — bazı platformlarda bu sıfıra dönüşüyordu, diğerlerinde ise tanınmayan bir değere.
Artılar:
Eksiler:
Bunun yerine unsigned değerler ve bit sayısını makrolarla maskeleyerek, tür uzunluğunu sizeof ile kontrol edip net belgelerle kullanıldı.
Artılar:
Eksiler: