Bayt dizisinden bit okuma

frekans50

⁵⁰
Katılım
8 Ekim 2022
Mesajlar
1,551
8000 baytlık dizimiz olsun
64bin bit demektir

Sıra noyu girerek bit değerini hızlıca nasıl okuyabiliriz?

Örnek
2345. bit 1 mi 0 mı ?

Aranan bit index , 8 e bölünerek mod alınarak yola çıkılacak... Kaçıncı bayt olduğu bulunarak... yapılır.

Bu formülü belirleyebilirim. Daha pratik bir yolu olmalı.
 
Son düzenleme:
claude AI sordum bu kodu verdi, mantıklı görünüyor.

Kod:
#include <stdio.h>
#include <stdint.h>

// Belirli bir biti okur (0 veya 1 döndürür)
int read_bit(uint8_t *array, int bit_position) {
    int byte_index = bit_position / 8;    // Hangi byte
    int bit_offset = 7 - (bit_position % 8);  // Byte içindeki pozisyon (soldan sağa)
   
    return (array[byte_index] >> bit_offset) & 1;
}

// Belirli bir biti değiştirir (0 veya 1 yapar)
void write_bit(uint8_t *array, int bit_position, int value) {
    int byte_index = bit_position / 8;
    int bit_offset = 7 - (bit_position % 8);
   
    if (value == 0) {
        // Biti 0 yap
        array[byte_index] &= ~(1 << bit_offset);
    } else {
        // Biti 1 yap
        array[byte_index] |= (1 << bit_offset);
    }
}

// Test için örnek kullanım
int main() {
    // 8000 byte'lık dizi oluştur (64000 bit)
    uint8_t data[8000] = {0};  // Tüm bitler 0 ile başlar
   
    // Örnek: 2345. biti 1 yap
    write_bit(data, 2345, 1);
   
    // 2345. biti oku ve yazdır
    int bit_value = read_bit(data, 2345);
    printf("2345. bitin degeri: %d\n", bit_value);
   
    // Farklı pozisyonları test et
    write_bit(data, 0, 1);      // İlk bit
    write_bit(data, 63999, 1);  // Son bit
   
    printf("İlk bit: %d\n", read_bit(data, 0));
    printf("Son bit: %d\n", read_bit(data, 63999));
   
    return 0;
}
 
fakat MSB-LSB konusuna dikkat etmelisin. başka bir yerde kullanmak üzere benzer kod yazdırdım çalışıyor ama LSB_MSB ters onu ayarlayamamıştı.
 
sonneti az zorlayınca devrecinin versiyonu ile (bit shift ve & işlemi) üretti.

-bu kod çok daha kısa ve hızlı olarak nasıl yazılabilir ?

Bit okuma fonksiyonunu daha kısa ve hızlı hale getirelim. İşte birkaç farklı optimizasyon yaklaşımı:
Optimizasyon nedenleri:
  1. Bölme (/) ve modulo (%) işlemleri yavaştır
  2. Bit kaydırma (>>) ve AND (&) işlemleri çok daha hızlıdır
  3. Gereksiz değişkenler kaldırıldı
  4. Tek satırda işlem tamamlanıyor
Kod:
// En kısa ve hızlı versiyon (bit shifting kullanarak)
int read_bit(uint8_t *a, int p) {
    return (a[p >> 3] >> (p & 7)) & 1;
}

// Alternatif versiyon (maskeleme kullanarak)
int read_bit2(uint8_t *a, int p) {
    return !!(a[p >> 3] & (1 << (p & 7)));
}
 

Forum istatistikleri

Konular
8,888
Mesajlar
144,491
Üyeler
3,573
Son üye
f20_74

Son kaynaklar

Back
Top