codepad
[
create a new paste
]
login
|
about
Language:
C
C++
D
Haskell
Lua
OCaml
PHP
Perl
Plain Text
Python
Ruby
Scheme
Tcl
/****************************************************************************** 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; }
Private
[
?
]
Run code
Submit