Forum: D Programlama Dili RSS
bitDerle ham (beta) hazır...:)
bitDerle is bitwise functions based on struct.
Avatar
Salih Dinçer #1
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: bitDerle ham (beta) hazır...:)
Merhaba,

Aslında henüz ham (beta) bile sayılmaz. Çünkü bitmemiş işlevler (functions) ve bir kaç kritik hata var. Yani alfa (Türkçesi ne bilmiyorum!) gibi görünüyor. Ancak doğru çalışıyor...:)

CodePad'de çalışmamasının sebebi ise işlevden aldığım değişkeni for(;...) içinde kullanmam olabilir.

[Resim: /forum/unb_lib/designs/modern/img/arrow_right.png]bitDerle v0.1.26: http://codepad.org/Dk0lIqSw

Kritik hatalara gelince; zaten main() içindeki ilk açıklama satırından hemen görmüşsünüzdür:
int main() {
    Bit!(ubyte) bit;
    //Bit!(ulong) bit; // !!! BAKILACAK !!!
    
    typeof(bit.bl) [] searchData = [ 7, 1, 137, 137, 137, 137, 3, 143 ];
    typeof(bit.bl) keyword1 = 0b1110;
    typeof(bit.bl) keyword2 = 0b0001;   //bit.invert(keyword1);
    
    bit.init(searchData);
    auto offset = bit.find(keyword1);
    
    bit.print(offset);//, bit.bl);
    auto test = bit.write(offset, keyword2, 4);
    bit.print(offset);//, bit.bl);
: : :
Çıktısı:
00000111_00000001_10001001_10001001_10001001_10001001_00000011_10001111
-----^
00000000_10000001_10001001_10001001_10001001_10001001_00000011_10001111
-----^
Partial Masking: [ 1110 ] Search term found.
First occurrence was at position 5.salih@telyeweb:~/DMD/bitDerle/bin$


Gerçi bakılacak bölüm çok ama bu en kritiği ve ilk koddan bu yana sürüklenen (epidemic) bir sorun. Ancak ne hikmetse ushort ve uint gibi veri türlerinde sorun yok. Belki çözüm bir çok yerde size_t kullanmam olabilir. Ali hocamın kıymetli yorumlarını bekliyorum...:)

Bundan sonraki aşama, bulDeğiştir() gibi bir işlev yapıp aranan terimin uzunluğunu otomatik bir şekilde kullanmak iyi olabilir. Bir nevi find ile write birleştirilecek. Ha keza find() işlevi içindeki bs değişkeni parametre ile bağlandığında skipSearch özelliği mümkün (denendi) görünüyor.

Dip Not: Ayrıca konsoldan ve/veya dosya içinden parametreler ile veri alıp işlemeli.

Teşekkürler...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Salih Dinçer:
Belki çözüm bir çok yerde size_t kullanmam olabilir.

Öyle. Kural şu: eğer indeks ve adet gibi bir kavramsa size_t olsun. Açıklamalar kodun içinde 'Ali' ile işaretli:

/******************************************************************************
bitDerle v0.1.26 ham (beta)
(c) 2012 - Salih Dinçer <salihdb@hotmail.com>
 
o Ali Çehreli <acehreli@yahoo.com>
o Zafer Çelenk <zafercelenk@gmail.com>
 
(o) Katkı sağladılar...
******************************************************************************/
import std.stdio;
 
struct Bit (data_t = ubyte) {
    data_t[] xData;
 
    data_t bl = data_t.sizeof * 8;   // bit length (ubyte => 8)
    auto lb = (bl.max / 2) + 1;      // last bit (ubyte => 128)
 
    /* [Ali] Konum (offset) oldukları için size_t uygundur. */
    auto mask(size_t rol, size_t lOffset, size_t mLength) {
        auto maske = data_t.max;
 
        maske >>= bl - mLength;
        maske <<= lOffset;
 
        // partial masking (offset/rolling 2/3 => 0b11100111)
        // if (rol) maske = ~maske; // invert mask
        for (; rol>0; rol--) {
            maske <<= 1;
            maske |= 1;
        }
 
        return maske;
    }
 
    auto reverse(data_t n) {
        data_t x = 0;
 
        for(auto i = 0; i < bl; ++i) {
            x <<= 1;
            x += n % 2;
            n >>= 1;
        }
 
        return x;
    }
 
    auto invert(data_t xPattern, data_t pLength = 0) {
        // !!! BAKILACAK !!!
 
        return ~xPattern;
    }
 
    void init(data_t[] data) {
        xData ~= data;
    }
 
    bool read(int n) {
        return (xData[n / bl] & (lb >> n % bl)) != 0;/*
 
        if((xData[n / bl] & (1 << n % bl)) != 0) return true;
        return false;//*/
    }
 
    /* [Ali] offset gibi bir konuz bilgisi için size_t uygundur. */
    size_t find(data_t xBit) {
        data_t xHead, xMask, x, xSay = xBit;
 
        for (x = 0; x <= bl; ++x, xSay >>= 1) if(xSay == 0) {
                xMask = mask(0, 0, x);
                for (auto bs = 0; bs < (xData.length * bl); ++bs, xHead <<= 1) {
                    if ((xData[bs / bl] & (lb >> bs % bl)) != 0) xHead |= 1;
                    xHead &= xMask;
                    if (xHead == xBit) return bs - x + 1;
                }
            }
 
        return 0// not found!
    }
 
    /* [Ali] Konum için size_t uygundur. */
    int write(size_t xOffset, data_t xPattern, data_t pLength) {
        /* [Ali] Buradaki cast'lere gerek kalmamış oluyor. */
        auto pOffset = bl - (xOffset % bl);   // pattern offset
        auto sOffset = pLength - pOffset;     // secondary offset
        auto lOffset = bl - sOffset;          // left offset
        auto rOffset = pOffset - pLength;     // right offset
 
        /* [Ali] xBit bir indeks olduğundan size_t uygundur. cast'e de gerek
         *       kalmadı.*/
        size_t xByte = xOffset / bl;
 
        if(xOffset) {
            if(pOffset >= pLength) {
                if(pOffset == pLength) {
                    xData[xByte] &= mask(0, pLength, bl);
                    xData[xByte] |= xPattern;
                    return 1;   // shift masking
                } else {
                    xData[xByte] &= mask(rOffset, pLength, bl);
                    xData[xByte] |= xPattern << rOffset;
                    return 2;   // rotate masking
                }
            } else {
                /* [Ali] 0 yerine size_t.init. (Aslında bu çok saçma oldu.) */
                xData[xByte] &= mask(cast(size_t)0, pOffset, bl);
                xData[xByte] |= xPattern >> sOffset;
 
                xByte++;   // next byte...
 
                xData[xByte] &= mask(lOffset, sOffset, bl);
                /* [Ali] 0 yerine size_t.init. (Bu da çok saçma oldu.) */
                xData[xByte] |= (xPattern & mask(size_t.init, size_t.init, sOffset)) << lOffset;
                return 3// partial masking
            }
 
            /* [Ali] dmd'nin -w seçeneği bu satıra hiç gelinmeyeceğini
             *       söylüyor.*/
            // return -1; // error!
        }
 
        return 0// no change...
    }
 
    /* [Ali] sb'nin ne anlama geldiği açık değil ama eğer konumsaq size_t
     *       uygundur. */
    void print(size_t sb, data_t sr = 0) {
 
        if (sr == 0) sr = bl;   // !!! BAKILACAK !!!
 
        for (uint i = 0; i < xData.length * bl; i++) {
            if ((i != 0) && (i % sr == 0)) writef("_");
            writef(read(i) ? "1" : "0");
        }
        writef("\n");
 
        for (uint i = 0; i < sb + (sb / sr); i++) writef("-");
        if (sb) writef("^\n");
    }
}
 
/* [Ali] Bütün türlerle deneyebilmek için bir şablon. */
void dene(T)()
{
    writefln("\n===== %s denemesi ======", T.stringof);
 
    Bit!(T) bit;
 
    typeof(bit.bl) [] searchData = [ 7, 1, 137, 137, 137, 137, 3, 143 ];
    typeof(bit.bl) keyword1 = 0b1110;
    typeof(bit.bl) keyword2 = 0b0001;   //bit.invert(keyword1);
 
    bit.init(searchData);
    auto offset = bit.find(keyword1);
 
    bit.print(offset);//, bit.bl);
    auto test = bit.write(offset, keyword2, 4);
    bit.print(offset);//, bit.bl);
 
    //writef("%b - ", test);/*
 
    if (test < 0) writef("!!! ERROR !!! ");
    else if (test == 0) writef("No Change: ");
    else if (test == 1) writef("Shift Masking: ");
    else if (test == 2) writef("Rotate Masking: ");
    else if (test == 3) writef("Partial Masking: ");
 
    //*/
    writef("[ %b ] Search term ", keyword1);
    if(offset) writef("found.\nFirst occurrence was at position %d.", offset);
    else writef("not found! Sorry...");
 
    /* [Ali] */
    writeln();
}
 
int main() {
    import std.typetuple;
 
    alias TypeTuple!(ubyte, ushort, uint, ulong) Types;
 
    foreach (Tür; Types) {
        dene!Tür();
    }
 
    /* [Ali] Başarılı sonlanma anlamında 0. */
    return 0;
}

Ali
acehreli (Moderatör) #3
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yukarıdakini 64 bitlik sistemde denemiştim. Aklıma bir de -m32 seçeneği ile denemek geldi, denedim, ve ne yazık ki -m32 ile derlenemediğini farkettim. :(

1) Şu değişiklikleri de yapınca -m32 ile de derleniyor: :)

// ...
    /* [Ali2] Uzunluk olduğu için size_t. */
    size_t bl = data_t.sizeof * 8;   // bit length (ubyte => 8)
// ...
    /* [Ali2] size_t */
    auto invert(data_t xPattern, size_t pLength = 0) {
// ...
        /* [Ali2] size_t */
        for (size_t x = 0; x <= bl; ++x, xSay >>= 1) if(xSay == 0) {
// ...
    /* [Ali2] size_t */
    int write(size_t xOffset, data_t xPattern, size_t pLength) {
// ...
    /* [Ali2] size_t */
    void print(size_t sb, size_t sr = 0) {
// ...
    /* [Ali2] T'yi zaten biz belirliyoruz; burada typeof'a gerek yok;
        varsa da typeof(bit.bl) değil typeof(bit.xData[0]) gibi olmalı. */
    T[] searchData = [ 7, 1, 137, 137, 137, 137, 3, 143 ];
    T keyword1 = 0b1110;
    T keyword2 = 0b0001;   //bit.invert(keyword1);
// ... 

2) Onları öyle düzelttikten sonra artık hiçbir yerde size_t.init yazmak da gerekmedi; hepsini basitçe 0 yazabildim. Zaten başından beri beni rahatsız ediyordu. :)

Ali
zafer #4
Üye Tem 2009 tarihinden beri · 700 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Bu projenin geliştiğini görmek beni çok mutlu ediyor. Her ne kadar geliştirici olarak katkı sağlayamasamda testçi olarak programı sürekli test ederek hata bildirimleri ile Salih'e destek vermeyi çok istiyorum. Tabi kendisi de kabul ederse?
https://github.com/zafer06 - depo
Avatar
Salih Dinçer #5
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Teşekkürler hocam, yine sayende yeni şeyler öğreniyorum...:)

Zafer, testi ben dahil foruma üye olmayan herkesin yapmasını arzu ederim; sonra üye olup şurada hata var demesini. Ama bence sen de katkı sağlayabilirsin ki sağladın bile. Aslında yazılabilecek işlevler var. Hatta belki senin arzu ettiğin class yapısına geçirip bunu D'de henüz olmayan bit sınıfı olarak projelerimizde kullanabiliriz. En azından şu da olsun diye fikir verebileceğini düşünüyorum.

Bu arada unutmadan bir soru: "bit" terimi rezerve edildiği halde nasıl kullanabiliyoruz?

Yukarıdaki içimde kalmıştı, devam etmeden sordum gitti. Ali hocam yetkin bir cevap verecektir...:)

Kodun son halini denedim ama ubyte ve ushort'da verilerin boş olduğunu (dolayısıyla bulamadığını) gördüm. Sebebini çözmeye çalışacağım ama ulong kullanacağız diye asıl mevzu bozulursa çok şart da değil hani. Çünkü 64 bitlik bir terim arama en seyreklerden olacaktır. UTF8 ile kodlanmış dosyalara hakim olması bile yeterli olabilir.

Dip Not: Test ederken büyük veri türlerinde xData'yı 3-4 elemanla kısıtlarsanız ekranın genişliğini geçmiyor...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #6
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
bit'in rezerve olduğunu sanmıyorum. :) Bütün anahtar sözcükler şurada Keywords başlığı altında var:

  http://dlang.org/lex.html

Ben 107 tane sayıyorum! :)

Ali
Avatar
Salih Dinçer #7
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Merhaba Ali Hocam,

Sitenin bu sayfasını görmemişim ama daha önce forumda şurada bahsettiğim listeden dolayı böyle bir soru sordum. Gerçi kaynağı belirsizdi ama ayrıntısından dolayı güvenilir zannettim. Belki de D1 ile ilgili bir durumdur bilemiyorum.

Aslında D neredeyse hiç bir dilin (Python dahil!) içermediği genişlikte algoritmalara sahip. Bazen Phobos kütüphanesinin kodlarını incelediğimde bir çok bilimsel kodlar ile karşılaşıyor ve şaşırıyorum. Ancak neden bit'leri parmağınızda oynatacak bir sınıf üretmemişler ona da şaşırıyorum. Ne diyelim belki bu çalışmayı görürler de üzerine çok daha kaliteli kodlar yazarlar ve D'ye katarlar. Açıkçası farklı derlenme ortamları (ARM, 8 bit MCU vb.) için bit'ler üzerinde daha çok işlem yapabilmeliyiz. Neyse ki Zafer buna vesile oldu.

Bu arada bir soru daha sormalıyım: 32 bit bir sistemde ulong ile oynaştığımda :) LSB'ye ne yazdıysam MSB'ye de bir kopyası çıkıyor. Bunu yazdığın kodda da görebilirsin. Ama 64 bit sistem ile derlenince ulong'da taş gibi çalışıyor. Neden olabilir, yanlış bir şey mi yapıyorum?
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #8
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Salih Dinçer:
32 bit bir sistemde ulong ile oynaştığımda :) LSB'ye ne yazdıysam MSB'ye de bir kopyası çıkıyor.

Benin yaptığım değişiklikler yalnızca kodun derlenebilmesi içindi. Derinlemesine incelemedim. Her işlevin teker teker doğru çalıştığını garantilemek gerek. (İpucu: unittest. :))

Ali
Avatar
Salih Dinçer #9
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Koddaki ulong değerleri üzerinde arama yapamama sorunu giderildi ve yapı BS ismine çevrilerek yeni bir bitDerle sınıfı içine alındı:

v0.2.02 ==> http://codepad.org/H5Dxz6ka

Evet, şimdi beta...:)

Dip Not: BS, Türkçe'deki Bir Sıfır kısaltması ve İngilizce bit karşılığı önermesidir. Bir harf daha kısa olduğu için sevdim. Ayrıca bitSearch gibi bir anlamı da vardı. Şimdi bitDerle sınıfı içine, yapı içinde kullanılmayan işlevler çekilip yeniler yazılabilir. Yani bu temel geliştirme için yeterli görünüyor.
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-18, 00:21:03 (UTC -08:00)