[ create a new paste ] login | about

Link: http://codepad.org/H5Dxz6ka    [ raw code | fork | 1 comment ]

salihdb - D, pasted on Apr 3:
/******************************************************************************
bitDerle v0.2.02 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.c.stdio: printf;/*
import std.stdio;

class bitDerle {
        // BS (BiR SIFIR ~ One Zero)
    struct BS (data_t = ubyte) {  
        data_t[] xData;
        
        immutable bl = data_t.sizeof * 8;           // bit length (ubyte => 8)
        immutable lb = (data_t.max / 2) + 1;        // last bit (ubyte => 128)
    
        auto mask(data_t rol, data_t lOffset, data_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(size_t n) {
            return (xData[n / bl] & (lb >> n % bl)) != 0;/*
            
            if((xData[n / bl] & (lb >> n % bl)) != 0) return true;
            return false;//*/
        }
        
        data_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 cast(data_t)(bs - x + 1);
                }
            }
            
            return 0;  // not found!
        }
    
        data_t write(data_t xOffset, data_t xPattern, data_t pLength) {
            auto pOffset = cast(data_t)(bl - (xOffset % bl));   // pattern offset
            auto sOffset = cast(data_t)(pLength - pOffset);     // secondary offset
            auto lOffset = cast(data_t)(bl - sOffset);          // left offset
            auto rOffset = cast(data_t)(pOffset - pLength);     // right offset
            auto xByte  = cast(size_t)(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 {
                    xData[xByte] &= mask(0, pOffset, bl);
                    xData[xByte] |= xPattern >> sOffset;
                    
                    xByte++;   // next byte...
                    
                    xData[xByte] &= mask(lOffset, sOffset, bl);
                    xData[xByte] |= (xPattern & mask(0, 0, sOffset)) << lOffset;
                    return 3;  // partial masking
                }
            }
            
            return 0;  // no change...
        }
    
        void print(data_t sb, data_t sr = bl) {
            for (size_t i = 0; i < xData.length * bl; i++) {
                if ((i != 0) && (i % sr == 0)) writef("_");
                writef(read(i) ? "1" : "0");
            }
            writef("\n");
            
            for (size_t i = 0; i < sb + (sb / sr); i++) writef("-");
            if (sb) writef("^\n");
        }
    }
}

int main() {
    bitDerle.BS!(ulong) bit;
    typeof(bit.xData) searchData = [ 7, 1, 137];//, 137, 137, 137, 3, 143 ];
    immutable keyword1 = 0b1110;
    immutable keyword2 = 0b0001;   //bit.invert(keyword1);
    
    bit.init(searchData);
    auto offset = bit.find(keyword1);
    
    bit.print(offset);
    auto test = bit.write(offset, keyword2, 4);
    bit.print(offset);
    
    //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...");
    writeln();
    
    return 0;
}


Create a new paste based on this one


Comments:
posted by salihdb on Apr 3
Koddaki ulong değerleri üzerinde arama yapamama sorunu giderildi. Evet, şimdi beta...:)
reply