32-bit bir tamsayının bitlerini ters çeviren (reverse bits) bir C fonksiyonu yazın.
Cevap
En basit çözüm, bitleri tek tek kaydırıp yeni sayıya eklemektir (32 iterasyon). Daha hızlı çözüm ise böl ve yönet yaklaşımıyla komşu bitleri, sonra ikilileri, dörtlüleri, byte'ları ve yarım word'leri yer değiştirmektir (5 adım, döngü yok).
1. Basit döngü (O(32))
uint32_t reverse_bits_loop(uint32_t x)
{
uint32_t r = 0;
for (int i = 0; i < 32; i++) {
r = (r << 1) | (x & 1u);
x >>= 1;
}
return r;
}2. Maske ile takas (O(log n), dallanmasız)
uint32_t reverse_bits(uint32_t x)
{
x = ((x >> 1) & 0x55555555u) | ((x & 0x55555555u) << 1); /* tek/çift bitler */
x = ((x >> 2) & 0x33333333u) | ((x & 0x33333333u) << 2); /* ikililer */
x = ((x >> 4) & 0x0F0F0F0Fu) | ((x & 0x0F0F0F0Fu) << 4); /* nibble'lar */
x = ((x >> 8) & 0x00FF00FFu) | ((x & 0x00FF00FFu) << 8); /* byte'lar */
x = (x >> 16) | (x << 16); /* yarım word'ler */
return x;
}Örnek: reverse_bits(0x00000001) sonucu 0x80000000, reverse_bits(0x0000000F) sonucu 0xF0000000 olur.
3. Tablo ile (byte başına lookup)
256 elemanlık bir const uint8_t rev8[256] tablosu Flash'ta tutulur ve 4 byte ayrı ayrı çevrilip yer değiştirilir. Hız/bellek dengesi iyidir.
4. Donanım talimatı
ARMv7-M (Cortex-M3/M4/M7) üzerinde tek çevrimlik RBIT talimatı vardır. CMSIS'te __RBIT(x), Clang'da __builtin_bitreverse32 kullanılabilir (GCC'de bu builtin yoktur). Cortex-M0'da bu talimat yoktur.
Neden sorulur?
Bit tersleme; LSB-first/MSB-first protokol dönüşümlerinde, reflected CRC hesaplarında ve FFT'deki bit-reversal sıralamasında gerçekten kullanılır. Görüşmeci önce çalışan basit çözümü, sonra optimizasyonu ve donanım desteğini konuşmanızı bekler.
İlgili C Programlama soruları
- C dilinde volatile anahtar kelimesi ne işe yarar?
- Bir yazmaçtaki belirli bir biti set, clear ve toggle eden C kodunu yazın.
- Stack ile heap arasındaki fark nedir? Gömülü sistemlerde dinamik bellek kullanımından neden kaçınılır?
- Endianness nedir? Little-endian ile big-endian farkı nedir?
- Bit field nedir? Donanım register'larına erişimde bit field mi yoksa bit maskesi mi kullanılmalı?
- Fonksiyon pointer'ları ve callback tabloları gömülü sistemlerde nasıl kullanılır? Bir state machine örneği verin.
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.