Groot getal opsplitsen

Wiskunde is niet alleen een vak op school. Kom je ergens in de praktijk (bijvoorbeeld tijdens je werk) een wiskundig probleem tegen dan kun je hier om hulp vragen.
Dyon
Nieuw lid
Nieuw lid
Berichten: 8
Lid geworden op: 19 jul 2012, 08:57

Groot getal opsplitsen

Bericht door Dyon » 19 jul 2012, 09:48

Hallo allemaal,

Ik heb het volgende probleem. Ik ontwerp nu een programma waarbij het belangrijk is om grote getallen op te slaan in bytes (Die gaan tot 256). Daarbij moet ik het grote getal opsplitsen in kleine getallen, zodat ik het op de computer kan bewaren. Daarna wil ik het weer uitlezen door de kleine getallen met elkaar te vermenigvuldigen.
Dat betekend het volgende:

Stel ik heb een groot getal 1320. Nu wil ik die in bytes opslaan. Natuurlijk kan dat niet, want in een byte past maar een getal 256. Dat is hetzelfde als dat ik een kom wil vullen met 1320ml, terwijl er maar 256ml in past. Dat gaat knoeien! Wat ik dus wil doen is die 1320 opsplitsen in kleinere getallen van 256. Maar er zit een probleem.
Logischerwijs zou ik die 1320ml kunnen opsplitsen tot kommetjes van 256ml. Dan doe ik later alle kommetjes terug schudden in de grote emmer en dan heb ik mijn 1320ml weer terug? Zoiets als:



Maar dat zijn behoorlijk veel kommetjes. Om ruimte te besparen probeer ik de kleinere getallen later met elkaar te vermenigvuldigen. Dit heeft als voordeel dat ik maar 2 bytes of kommetjes hoef te gebruiken. Terug naar de 1320. Als ik het zou opsplitsen en het later weer zou terugrekenen door het te vermenigvuldigen, zou ik de volgende 2 bytes nodig hebben, 66 en 20:



Het is logisch dat ik 2 bytes nodig heb en niet één, want met één byte van maximaal 256 kan ik geen 1320 maken. Het grootste getal wat ik kan maken met 2 bytes is:



Heb ik een groter getal dan 65536, dan zou ik 3 bytes nodig hebben, of meer..
Nu wil ik dus weten hoe ik aan die 2 of 3 bytes kan komen? In het voorbeeld had ik: 66 en 20. Maar deze 2 getallen heb ik handmatig moeten gokken. Hoe kan ik deze getallen nu uitrekenen? Ik weet van tevoren hoeveel bytes er nodig zijn, maar is het mogelijk de exacte 2, 3, etc, bytes uit te rekenen?

Alvast heel erg bedankt! :D
PS: Mocht ik dit verkeert geplaatst hebben, graag effe zeggen ^^

Mvg Dyon.
Laatst gewijzigd door Dyon op 19 jul 2012, 13:26, 2 keer totaal gewijzigd.

SafeX
Moderator
Moderator
Berichten: 14278
Lid geworden op: 29 dec 2005, 11:53

Re: Groot getal opsplitsen

Bericht door SafeX » 19 jul 2012, 10:07

Bedenk eerst eens hoe je 1320 in het 10-tallig stelsel moet lezen.



Hoe zou je nu bv 7 schrijven in het binaire stelsel:



Zie je hoe de 'getallen' tot stand komen?

Probeer eens de getallen 0, 1, 2, 3 binair te schrijven ...

Dyon
Nieuw lid
Nieuw lid
Berichten: 8
Lid geworden op: 19 jul 2012, 08:57

Re: Groot getal opsplitsen

Bericht door Dyon » 19 jul 2012, 10:36

SafeX schreef:Bedenk eerst eens hoe je 1320 in het 10-tallig stelsel moet lezen.



Hoe zou je nu bv 7 schrijven in het binaire stelsel:



Zie je hoe de 'getallen' tot stand komen?
Ik zie niet echt het verband wat je me probeert te vertellen, maar ik zie wel de formules. Na wat Wikipedia weet ik nu dat je de nullen en eentjes gewoon moet opptellen volgens:



Waarbij 'a' het nulletje of eentje is en 'i' de positie is van het nulletje of eentje van rechts naar links. Alleen is dit meer het terug rekenen van de kleine getallen die ik al heb.
SafeX schreef:Probeer eens de getallen 0, 1, 2, 3 binair te schrijven ...
Dit is het probleem waar ik mee zit? Het heen rekenen van het grote getal naar de kleine getallen. Ik weet niet hoe dat moet?

Kan er wat meer uitleg gegeven worden?

Mvg Dyon.

tsagld
Vergevorderde
Vergevorderde
Berichten: 341
Lid geworden op: 23 mar 2009, 12:07
Contacteer:

Re: Groot getal opsplitsen

Bericht door tsagld » 19 jul 2012, 10:48

Normaal gesproken hoef je je hier niet druk om te maken bij het programmeren.
Je compiler regelt dat automatisch en slaat de getallen op in het 256-tallig stelsel als je het op byte-niveau bekijkt:

1320 = 5*256^1 + 40. Je hebt dus twee bytes nodig, met in het eerste byte een 5 en in het tweede een 40.

Ander voorbeeld:
478934 = 7*256^2 + 78*256^1 + 214. Drie bytes nodig: 7, 78, 214

In 32-bits systemen worden overigens standaard vier bytes gebruikt voor gehele getallen, waarbij de niet gebruikte een nul bevatten.

Dyon
Nieuw lid
Nieuw lid
Berichten: 8
Lid geworden op: 19 jul 2012, 08:57

Re: Groot getal opsplitsen

Bericht door Dyon » 19 jul 2012, 11:02

Het spijt me echt heel erg, maar... hoe kom je nu aan die 5 en 34 en die 7, 78 en 214?? :?

Hier hoef je trouwens inderdaad normaal niet over na te denken, maar ik heb dit voor verscheidene dingen nodig gehad. Bijvoorbeeld bij het opslaan van grote getallen in bestanden. Die ga ik uiteraard niet letterlijk opslaan als: 1, 3, 2, 0, .. dat vreet hardeschijf ^^

Dit keer heb ik het nodig bij het opslaan van grote getallen in geheugen en het kan niet door de computer omgezet worden. Dus ik moet het zelf doen!

Mvg Dyon.

tsagld
Vergevorderde
Vergevorderde
Berichten: 341
Lid geworden op: 23 mar 2009, 12:07
Contacteer:

Re: Groot getal opsplitsen

Bericht door tsagld » 19 jul 2012, 11:23

Kijk naar het vet gedrukte...het is niets anders als het tientallig getal omzetten naar het 256-tallig stelsel:

1320 = 5*256^1 + 40. Je hebt dus twee bytes nodig, met in het eerste byte een 5 en in het tweede een 40.

Ander voorbeeld:
478934 = 7*256^2 + 78*256^1 + 214. Drie bytes nodig: 7, 78, 214

Misschien wordt het duidelijk als we andersom redeneren:
Stel ik heb vier bytes met achtereenvolgens de volgende willekeurige waarden:
86, 211, 44, 120

Dan is het decimale equivalent hiervan:
86 * 256^3 + 211 * 256^2 + 44 * 256^1 + 120 * 256^0 = 1456680056

SafeX
Moderator
Moderator
Berichten: 14278
Lid geworden op: 29 dec 2005, 11:53

Re: Groot getal opsplitsen

Bericht door SafeX » 19 jul 2012, 11:29

SafeX schreef:Probeer eens de getallen 0, 1, 2, 3 binair te schrijven ...
Dit is het probleem waar ik mee zit? Het heen rekenen van het grote getal naar de kleine getallen. Ik weet niet hoe dat moet?
Maar kan je deze getallen binair schrijven?

Heb je begrepen hoe je 1320 in het 10-tallig stelsel moet lezen?

Heb je begrepen dat 111 de binaire schrijfwijze is van het getal 7 (decimaal)?

tsagld
Vergevorderde
Vergevorderde
Berichten: 341
Lid geworden op: 23 mar 2009, 12:07
Contacteer:

Re: Groot getal opsplitsen

Bericht door tsagld » 19 jul 2012, 11:34

Overigens, als het om écht grote decimale getallen gaat, groter dan 256^4 bedoel ik, en je wil dit geautomatiseerd omzetten naar 256-tallig, is dat niet zo eenvoudig.

Je moet dan zelf een deling door 256 programmeren...daar zijn wel weer hulpmiddelen voor te vinden op het web. In welke taal programmeer je?

Dyon
Nieuw lid
Nieuw lid
Berichten: 8
Lid geworden op: 19 jul 2012, 08:57

Re: Groot getal opsplitsen

Bericht door Dyon » 19 jul 2012, 12:01

Ik weet niet zeker of we samen op een lijn zitten, maar ik ga ervan uit dat jullie me ook zelf willen laten nadenken. Dus ik zal even precies doen wat er gevraagd word:
SafeX schreef:Maar kan je deze getallen binair schrijven?
ja dat kan ik:






Dit heb ik uit het hoofd en ik hoop dat het correct is?? :wink:
SafeX schreef:Heb je begrepen hoe je 1320 in het 10-tallig stelsel moet lezen?
Ja. Je schrijft het hetzelfde als in het binaire stelsel? Toch? Dus:


SafeX schreef:Heb je begrepen dat 111 de binaire schrijfwijze is van het getal 7 (decimaal)?
Ja, want:


tsagld schreef:Kijk naar het vet gedrukte...het is niets anders als het tientallig getal omzetten naar het 256-tallig stelsel:

1320 = 5*256^1 + 40. Je hebt dus twee bytes nodig, met in het eerste byte een 5 en in het tweede een 40.

Ander voorbeeld:
478934 = 7*256^2 + 78*256^1 + 214. Drie bytes nodig: 7, 78, 214

Misschien wordt het duidelijk als we andersom redeneren:
Stel ik heb vier bytes met achtereenvolgens de volgende willekeurige waarden:
86, 211, 44, 120

Dan is het decimale equivalent hiervan:
86 * 256^3 + 211 * 256^2 + 44 * 256^1 + 120 * 256^0 = 1456680056
Dus 5 en 40 zijn nodig om 1320 te maken? Ja dat is duidelijk :wink: want als ik dat nu hetzelfde doe als bij de vorige formules dan zou ik die 2 of 10 moeten vervangen door 256? Want 2 staat voor 0 - 1. 10 staat voor 0 - 9 en dan is 256 voor 0 - 255?

Oke.. en nu? Mijn vraag is nog niet opgelost? Ik weet nu dus hoe ik de kleine getallen moet gebruiken om een groot getal te maken?

Mvg Dyon.

PS:
tsagld schreef:Overigens, als het om écht grote decimale getallen gaat, groter dan 256^4 bedoel ik, en je wil dit geautomatiseerd omzetten naar 256-tallig, is dat niet zo eenvoudig.

Je moet dan zelf een deling door 256 programmeren...daar zijn wel weer hulpmiddelen voor te vinden op het web. In welke taal programmeer je?
Ik hoop dat ik nooit met zulke getallen hoef te werken ^^ Ik ben nu C++ aan het leren. Ik kan wat console teksten schrijven en ik weet hoe datatypes werken en hoe je arrays kan maken, etc... Dit is wel niet mijn eerste taal ;) Ik weet hoe je een getal groter dan 256^10 kan uitrekenen, door het als string op te slaan en de reken functies zelf te maken. Zoals de plus, de min en de keer. Dit was toevallig een van mijn vorige projecten in een andere taal.

SafeX
Moderator
Moderator
Berichten: 14278
Lid geworden op: 29 dec 2005, 11:53

Re: Groot getal opsplitsen

Bericht door SafeX » 19 jul 2012, 12:28

Dyon schreef:Ik weet niet zeker of we samen op een lijn zitten, maar ik ga ervan uit dat jullie me ook zelf willen laten nadenken. Dus ik zal even precies doen wat er gevraagd word:
SafeX schreef:Maar kan je deze getallen binair schrijven?
ja dat kan ik:






Dit heb ik uit het hoofd en ik hoop dat het correct is?? :wink:
Dit is niet goed.

In het 10-tallig stelsel hebben we 10 cijfers als symbolen, dus: 0, 1, 2, 3, 4 ,5, 6, 7, 8, 9
Je hebt 1 positie nodig voor de getallen 0 t/m 9
Twee posities voor de getallen 0 t/m 99: bv enz
Drie posities voor de getallen 0 t/m 999: bv enz
...


Binair (2-tallig) hebben we 0 en 1 als symbolen.
Dus 1 positie geven de getallen 0 en 1 aan: 0, 1.
Twee posities: 00, 01, 10, 11, dit zijn de getallen 0, 1, 2, 3 (10-tallig)
Drie posities: 000, 001, 010, ... , 111: bv

Is dit duidelijk?

Opm: we zijn gewend nullen die aan het eerste cijfer (ongelijk 0) voorafgaan weg te laten.




Zegt het woord hexadecimaal je iets?

tsagld
Vergevorderde
Vergevorderde
Berichten: 341
Lid geworden op: 23 mar 2009, 12:07
Contacteer:

Re: Groot getal opsplitsen

Bericht door tsagld » 19 jul 2012, 12:49

Dit helpt vast ook: algoritme om een decimaal getal om te zetten naar 256-tallig, bytes dus:

Voorbeeld: 1000000 (1 miljoen)

1000000 / 256 = 3906, rest 64
3906 / 256 = 15 rest 66
15 / 256 = 0 rest 15

drie bytes nodig: 15, 66, 64
oftewel 15 * 256^2 + 66 * 256^1 + 64 = 1000000

Dyon
Nieuw lid
Nieuw lid
Berichten: 8
Lid geworden op: 19 jul 2012, 08:57

Re: Groot getal opsplitsen

Bericht door Dyon » 19 jul 2012, 13:24

SafeX schreef: Dit is niet goed.
Niet?
Het ging dan om de vraag, kun je 1 binair schrijven? Wat ik denk ik nog moet toevoegen:
En dat is te bewijzen met:
Ik denk dat dat is wat je bedoelde?

Dit deel:
tsagld schreef:oftewel 15 * 256^2 + 66 * 256^1 + 64 = 1000000
Begrijp ik dan.
tsagld schreef: 1000000 / 256 = 3906, rest 64
3906 / 256 = 15 rest 66
15 / 256 = 0 rest 15
Aaaaah, zo doe je dat dus! Dit is precies wat ik de hele tijd zocht. Ik begreep even niet hoe je aan die rest kwam, maar je moet de rest van de deling keer 256 doen? Dan krijg je idd 64, 66 en 15!

Heel erg bedankt iedereen voor het helpen! Hiermee is het gelukkig opgelost ^^

Mvg Dyon.

David
Moderator
Moderator
Berichten: 4927
Lid geworden op: 14 mei 2009, 16:22

Re: Groot getal opsplitsen

Bericht door David » 19 jul 2012, 13:44

De resten kan je eventueel vinden met modulair rekenen.
Stap 1 van het oplossen van een probleem is te erkennen dat je een probleem hebt.
(Raffiek Torreman)

tsagld
Vergevorderde
Vergevorderde
Berichten: 341
Lid geworden op: 23 mar 2009, 12:07
Contacteer:

Re: Groot getal opsplitsen

Bericht door tsagld » 19 jul 2012, 13:54

begreep even niet hoe je aan die rest kwam, maar je moet de rest van de deling keer 256 doen?
Deze opmerking begrijp ik dan weer niet, maar als het algoritme maar duidelijk is.

Rest mij nog op te merken dat dit wel de basis van de basis van computerkennis is...

Daarnaast, al eerder opgemerkt, het automatiseren van dit algoritme als je alleen de losse cijfers van een getal hebt is niet eenvoudig...

Dyon
Nieuw lid
Nieuw lid
Berichten: 8
Lid geworden op: 19 jul 2012, 08:57

Re: Groot getal opsplitsen

Bericht door Dyon » 19 jul 2012, 14:31

tsagld schreef:
begreep even niet hoe je aan die rest kwam, maar je moet de rest van de deling keer 256 doen?
Deze opmerking begrijp ik dan weer niet, maar als het algoritme maar duidelijk is.
Wat ik bedoelde te zeggen was dat ik een kommagetal kreeg, namelijk: 0,25. Ik wist dus effe niet wat er verkeert was, maar toen begreep ik dat je dat keer 256 moet doen. dan krijg je namelijk 64!
tsagld schreef: Rest mij nog op te merken dat dit wel de basis van de basis van computerkennis is...
Dankjewel..
tsagld schreef: Daarnaast, al eerder opgemerkt, het automatiseren van dit algoritme als je alleen de losse cijfers van een getal hebt is niet eenvoudig...
Wat ik heb is het volledige getal opgeslagen in een variable.. dat heb ik gedaan door de losse getallen steeds toe te voegen aan een variable en het daarna te vermenigvuldigen door 10. Daarna hoef ik de variable alleen nog maar te delen en het fractionele gedeelte keer 256 te doen. Het fractionele deel sla ik apart op en als het hele getal opgesplitst is hoef ik het alleen nog maar op te slaan, zodat ik het later weer kan uitlezen.

Eitje ^^

Mvg Dyon.

Plaats reactie