07. juli 2010 - 11:28Der er
12 kommentarer og 1 løsning
BigInteger - udskrift af binær repræsentation? - binær ekspansion
Den nye fantastiske BigInteger der følger med .NET 4's System.Numerics vil ikke spytte binære værdier ud.
Det er tilsyneladende utroligt nemt i Java men er det mig umuligt at finde ud af i C#.NET BigInteger tal = whatever; tal.toString(2); giver det ønskede udprint fx: 110010000011111110010100000110000
Hvordan overtaler jeg C#.NET til at gøre noget tilsvarende?
tak - men problemet er at 1000 er et meget lille tal - der er angiveligt ikke nogen overloaded metode der understøtter BigIntegers. BigInteger t = BigInteger.Parse(inputnr.Text); Convert.ToString(t, 2); //no dice
Jeg har brug for at kende binær form af 1024 bit store tal Genereret on the fly fra brugerinput, -og anvendes i videre beregninger
Har forsøgt ting svarende til algoritmer der virker i javascript som det her: function printdigits(t){ var digits =[0,1]; for(i=15;i>=0; i--){ document.write(digits[(t>>i)&1]); }
Men det pangler i C#. De binære operatorer opfører sig ikke helt forudsigeligt...
@arne_v mange tak :) Jeg var godt klar over at det var hurtig slamkode der skulle optimeres, men ikke sikker på hvordan det bedst kunne gøres.
Det virker nu efter hensigten. Måske lidt bagvendt at sammensætte oppefra og nem. Men koden giver fx korrekt at 174050332293622031404857552280219410364023488927386650641 giver 01110001100100101011100101011111111111001000110110100111100001100011000100000001000111101101011010110010010011001101110101010111001111111001011101111010000100011110011110010100100000010001. Kontrolleret via Maple.
Men det er ikke altid at man skal leve efter "if-it-works-dont-fix-it" princippet.
Fortrinlige demonstrationseksempler! Endnu en gang tak. Ville gerne give dig point arne_v men det ser ud som om jeg bare har spildt dem på mig selv. (:-O)
Nærmere undersøgelse viser at din good algoritme giver det forkerte resultat. Talle behøver ikke være større end 8 bit for at vise det. Indsæt fx BigInteger v = new BigInteger(256); i stedet for 10. eller BigInteger v = BigInteger.Parse("174050332293622031404857552280219410364023488927386650641");
Som jeg ser det må det netop være fordi den blot oversætter hver byte for dig til dens bit værdi i stedet for at se på hele tallets værdi i bit. Men din 'bad' algoritme er en klar forbedring :) 10 gange så hurtig.
Det må være 'binary rightshift' og 'binary and' der tager tiden. Den kluntede strengopbygning jeg lavede kunne selvfølgelig gøres pænere med stringbuilder, men det synes ikke at bidrage væsentligt til tidsoptimering. Jeg havde vist ikke læst ordentligt på ToByteArray. Fjollet ikke at benytte de faktiske værdier bare i byte array form - når de nu er lige til at trække ud, frem for at 'genopfinde' tallet som jeg gjorde.
Proev selv og lav kode som shifter et byte array med 1000 elementer 1 bit. Det bliver en for loekke med 1000 iterationer hvor der i hver iteration skal konstrueres en byte udfra 1 bit fra en byte og 7 bit fra en anden byte.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.