Kaip apsukti bitų seką iš LSB į MSB? Galima padaryti ciklą ir kiekvieną bituką perkopijuoti į kitą baitą. Atrodo paprasta užduotis ir šiuolaikiniam 32/64 bitų kompui paprastas reikalas. Taip ir atrodė, kol nepabandėm prasukti megabaitus… Chmm, atrodo lėtokai. Galima daryti su 256 variantų look-up lentele. Keista atrodo, bet irgi ne taip greita kaip atrodo… x86 ar 64 tikrai turi kokias nors komandas tokioms operacijom… bet VB.NET nusprendė, kad to nereikia…
O ką siūlo internetiniai maniakai…? Wow:
a = ((buferis(i) * &H202020202UL And &H10884422010UL) Mod 1023UL) ' no way! 3 operacijos
Kas per? Bet veikia! Ir gana greitai veikia… geras. Buvo dar keli variantai kurie veikia su C ar C# ar C++, bet perrašius į VB jau neveikia. Spėju dėl “overflow”, nes VB neleidžia daryti perpildymo tokiose operacijose.
O kas dėl teksto? Ogi vėl lėtai veikia. Visose VB.NET pavyzdukuose naudojama:
tekstas="Tekstas"+kazkas.ToString+"dar kazkas"+vbCrLf
arba
sampleStr = "Hello" & " World"
Viskas kaip ir veikia. O bet tačiau! Jei pabandytumėm tokias operacijas padaryti su keliais milijonais teksto gabaliukų, pastebėtume, kad kompas intensyviai dirba. Tačiau lėtai. Kame reikalas? Ogi MS programuotojai nusprendė, kad nafig optimizuoti tą kodą (matyt dėl suderinamumo- tai dėl atminties rezervavimo subtilybių) ir kiekviena operacija tai naujo “string” sukurimas ir kopijavimas į jį. Techniškai du stringai nesusijungia, o sukuriamas trečias stringas i kurį kopijuojama pirmų stringų turinys. Darant milijonus operacijų, tai labai pasijunta.
Kaip tai sprendžiasi? Juk stringų klijavimas yra viena iš pamatinių demokr….ptfu programavimo principų. Yra net specialios stringų programavimo kalbos (perlas?) ir panašiai.
MS sukūrė dar vieną kintamųjų tipą: System.Text.StringBuilder(). Va į šitą galima klijuoti kiek nori visokiausių teksto stringų. Ir tai darosi tikrai greitai. Milijonus teksto gabaliukų suklijuoja akimirksniu palyginus su senu metodu (dešimtys sekundžių).
Kas moka programuoti, tai tokie reikalai visiškai nestebina. O man tai tikrai atradimai. O jei dar pašnekėti apie Multi Thread… 🙂
Aš kažkada irgi buvau susidūręs su pirmine problema jog reikėjo keisti iš LSB į MSB ar tai atvirkščiai tik man taip keistokai pasirodė ta idėja tų kurie kūrė tą čipą. Likau nesupratęs kam 12bit reikia paduoti vienaip o kitus kitaip??? Ačiū jog pasidalinai manau pravers
dar keli variantai kurie kažko neveikia VB:
a = (((buferis(i) * &H802UL And &H22110UL) Or (buferis(i) * &H8020UL And &H88440UL)) * &H10101UL >> 16) ‘ 7 operacijos, neveikia
a = (((buferis(i) * &H80200802UL) And &H884422110UL) * &H101010101UL >> 32) ‘ 4 operacijos, neveikia