Bayt dizisinden bit okuma

Katılım
8 Ekim 2022
Mesajlar
956
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.

C:
#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;
}
 
Kullandigin islemciye gore cozum degisir.

ARM islemci ise bit banding ozelligi ile dehset hizli okursun.
 
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
C:
// 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)));
}
 

Çevrimiçi üyeler

Forum istatistikleri

Konular
6,951
Mesajlar
118,748
Üyeler
2,824
Son üye
selocan32

Son kaynaklar

Son profil mesajları

hakan8470 wrote on Dede's profile.
1717172721760.png
Dedecim bu gul mu karanfil mi? Gerci ne farkeder onu da anlamam. Gerci bunun anlamini da bilmem :gulus2:
Lyewor_ wrote on hakan8470's profile.
Takip edilmeye başlanmışım :D ❤️
Merhaba elektronik tutsakları...
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
Back
Top