Bit Manipülasyonu: Bayrak İşlemleri ve Optimizasyon
# Bit Manipülasyonu: Bayrak İşlemleri ve Optimizasyon
Bit manipülasyonu, bellek kullanımını azaltıp işlem hızını artıran güçlü bir tekniktir. Özellikle bayrak (flag) işlemleri, bir bit'i açıp kapatmak, gömülü sistemlerde, oyun motorlarında ve sistem yazılımında sık kullanılır.
Bir tamsayının her biti bağımsız bir bayrak gibi davranabilir. Örneğin 1 baytlık bir değişkende 8 farklı boolean durumu tutabilirsin. İşlemler hızlı ve bellek tasarruflu olur.
Bit operatörleri şunlardır:
- `&` (AND): İki bit de 1 ise sonuç 1
- `|` (OR): En az biri 1 ise sonuç 1
- `^` (XOR): Bitler farklı ise sonuç 1
- `~` (NOT): Biti tersine çevir
- `<<`, `>>`: Sola/sağa kaydır
1. Bayrak Ayarla (SET)
Belli bir biti 1 yapma. Konumu n olan bit için: flags |= (1 << n);
2. Bayrak Kontrol Et (CHECK)
Bir bitin 1 olup olmadığını kontrol etme: if (flags & (1 << n)) { / bit açık / }
3. Bayrak Temizle (CLEAR)
Bir biti 0 yapma: flags &= ~(1 << n);
4. Bayrak Değiştir (TOGGLE)
Biti tersine çevir: flags ^= (1 << n);
Bir oyun karakterinin durumlarını (sağlık, mana, zehir, ölü) 1 bayt ile tutacağız.
1#include <stdio.h>2#include <stdint.h>34#define ALIVE 05#define MANA 16#define POISON 27#define SHIELD 389int main() {10uint8_t status = 0; // Başlangıçta tüm bayraklar kapalı1112// Karakter sağlıklı ve mana var13status |= (1 << ALIVE);14status |= (1 << MANA);1516printf("Durum: %d (binary: ", status);17for (int i = 7; i >= 0; i--)18printf("%d", (status >> i) & 1);19printf(")\n");2021// Zehir aldı22status |= (1 << POISON);23printf("Zehir aldı: %d\n", (status & (1 << POISON))? 1: 0);2425// Kalkan aldı26status |= (1 << SHIELD);27printf("Kalkan var: %d\n", (status & (1 << SHIELD))? 1: 0);2829// Manayı kullandı30status &= ~(1 << MANA);31printf("Mana kaldı: %d\n", (status & (1 << MANA))? 1: 0);3233return 0;34}Beklenen Çıktı:
1Durum: 11 (binary: 00001011)2Zehir aldı: 13Kalkan var: 14Mana kaldı: 0- Bellek: 8 boolean yerine 1 bayt kullan
- Hız: Bit işlemleri CPU'da tek sikloda tamamlanır
- Taşınabilirlik: Makro tanımlarla kodun okunabilirliği artar
Makro yazarsan daha temiz olur: #define SET_FLAG(x, n) ((x) |= (1 << (n)))
Bit manipülasyonu başta karışık görünse de, pratik yaptıkça sistem yazılımı ve düşük seviye optimizasyonda çok işine yarar.
0 yorum