Bayt dizisinden bit okuma

frekans50

⁹⁸⁷⁶⁵⁴³²¹⁰
Katılım
8 Ekim 2022
Mesajlar
1,137
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;
}
 
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
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
7,544
Mesajlar
126,364
Üyeler
3,057
Son üye
ermantml

Son kaynaklar

Son profil mesajları

Python Geliştirmeye eklediğim yapay zeka sunucusu, yeni başlayanlar için roket etkisi
Bir insanın zeka seviyesinin en kolay tesbiti, sorduğu sorulardır.
yapay zeka interneti yedi bitirdi, arama motoru kullanan, forumlara yazan kaldı mı ?
Freemont2.0 herbokolog Freemont2.0 wrote on herbokolog's profile.
nick iniz yakıyor
:D
Freemont2.0 posta Freemont2.0 wrote on posta's profile.
Merhabalar :)
Back
Top