2 Variablen in eine packen, und hinterher wieder 2 draus.
Übersicht

![]() |
BtbNBetreff: 2 Variablen in eine packen, und hinterher wieder 2 draus. |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi!
Ich möchte gerne 2 Varibalen in eine zusammenpacken, und hinterher wieder ausßeinander bekommen, um sie besser übers Inet versenden zu können. Nur ich hab keinen Plan, wie. BORNtobeNAMELESS |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Könntest Du etwas präziser werden ? was für Variablen (Strings?, Int? Float?).
Welche Werte nehmen sie denn an (min-max)? Dann kann man eventuell helfen. EDIT: Ach ja, und mach deinen Avatar bitte kleiner. Obergrenze sind 100x100 pixel ![]() |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
BtbN |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich habe 2 Integer-Zahlen(x,y Koordinaten), die maximal 1000 sind und die ich über das Inet verenden möchte.
Und da ich sie nicht 2 mal getrennt versenden KANN(das hat seine Gründe), muss ich sie zusammenpacken. Edit: Zahlenbereich: 0 bis 1000 |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
gut, integer bis 1000, d.h. maximal 10 Bit Bandbreite. Dann geht das problemlos, da ein int ja 32 bit breit ist.
Der Einfachheit halber werde ich 16- bitweise auftrennen: Code: [AUSKLAPPEN] Koord1=koord1*65536
versenden=koord1+koord2 zum Zerlegen: Code: [AUSKLAPPEN] koord2 = versenden and 65535
koord1= (versenden-koord2)/65536 Getestet, sollte funzen. |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
BtbN |
![]() Antworten mit Zitat ![]() |
---|---|---|
Gut, es funktioniert!
Danke. Aber ich verstehe nicht, warum es das tut. Könntest du es eventuell erklären? Biiiiitttttttööööööööööööö!!!!! |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also, jede Integervariable bei BB ist 4 Byte gross (32 bit).
daher ist die maximale Grösse für ne Zahl auch 2^32 (das sind grob 4 Milliarden) Allerdings verwendet BB das oberste bit als Vorzeichenbit, so dass man anstatt 0-4Mrd. -2 bis +2 Mrd. hat, das tut für unser Problemchen hier aber nichts zur Sache. Nun weisst Du das deine Koordinaten nicht grösser als 1000 werden. Die nächste 2er-Potenz ist 1024 (bei jeder 2erpotenz wird ein bit mehr zur Darstellung im Speicher verbraucht). 1024 sind wie gesagt 2^10, d.h. jede Zahl zwischen 0 und 1023 belegt nur die 10 niederwertigsten bit der Integer. Was ich nun mache, ist eine deiner Beiden Zahlen in einen höheren Bitbereich zu verschieben. (65536 ist die dezimale Entsprechung für 2^16, d.h. ich verschieber eine der Zahlen in "die obere Hälfte" der Integer.) Nach dem Versenden maskiere ich mit dem AND erstmal die unteren 16 bit und lese sie aus (Maskieren heisst, dass die anderen nicht gelesen (=0 gesetzt) werden, dazu solltest Du dich mal mit Bitoperanden vertraut machen). Dann hab ich schon eine Var wieder. Die Zweite ergibt sich, indem Ich das ausgelesene Lösche (versenden-koord2) und dann wieder in den "normalen" Bereich verschiebe, also mittels Divison wieder um 16 bit nach "unten" transferiere. Ich hätte dazu auch mit ql:SHR und ql:SHL arbeiten können, auch ne Lektüre wert ![]() Ich hoffe das war verständlich. |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
BtbN |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ah!
Es war verständlich. Ich hab daraus ma 2 Funktionen gebastelt: BlitzBasic: [AUSKLAPPEN] Function twoinone(var1,var2) Die müsten so richtig sein. BORNtobeNAMELESS |
||
David |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hi!
BlitzBasic: [AUSKLAPPEN]
Das läuft genauso ab: 30 = 11110b 1000 = 1111101000b Dann shiftest du die erste Zahl (hier 30) um 16 Bit nach links, was 1966080 entspricht also 111100000000000000000b. Danach verknüpfst du die zweite Zahl (hier 1000) mit dem vorherigen Ergebniss. Code: [AUSKLAPPEN] 0 or 0 = false 1 or 0 = true 1 or 1 = true 0 or 1 = true Dann bekommst du die Zahl 1967080 also 111100000001111101000 b. Klaro??? Das entpacken ist der umgekehrte Weg, du "maskierst" quasi deine Zahl. Code: [AUSKLAPPEN] 0 and 0 = true 1 and 0 = false 1 and 1 = true 0 and 1 = false Wenn du also 111100000001111101000b und 1111111111111111b (0xffff) verknüpfst bekommst du deine 1111101000b (1000) zurück. Um die zweite Zahl zu extrahieren must du deine gepackte Zahl um die 16 Bit zurückschieben (diesmal nach rechts) und mit 0xffff maskieren. Easy, oder??? Achja, shr 16 entspricht einer division durch 0xffff also 65535. Shl 16 entspricht einer Multiplikation mit 65535. Edit: Mist, zu langsam! |
||
- Zuletzt bearbeitet von David am Sa, Jun 25, 2005 16:58, insgesamt einmal bearbeitet
![]() |
BtbN |
![]() Antworten mit Zitat ![]() |
---|---|---|
Die andere Variante fand ich besser!
Die hab ich wenigstens verstanden... |
||
David |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hi!
Is genau das selbe... Scheinst es nicht verstanden zu haben. ;P grüße |
||
fliege |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
geht das mit belibig vielen variablen?
Fliege |
||
Wer weiß was kommt.. ? |
Absoluter Beginner |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Nein das kommt auf Min-Max an
Also je größer die zahlen desto weniger passen rein |
||
Error Inside! |
![]() |
RallimenSieger des 30-EUR-Wettbewerbs |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hier noch eine minimal kürzere Version..
BlitzBasic: [AUSKLAPPEN] a=60000 |
||
[BB2D | BB3D | BB+]
|
fliege |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
bis zu welcher zahl passen denn drei zahlen rein?
Fliege |
||
Wer weiß was kommt.. ? |
![]() |
Jan_Ehemaliger Admin |
![]() Antworten mit Zitat ![]() |
---|---|---|
32 bit,
32/3 = 10 Rest 2 2^10 = 1024 undhaste sogar noch 2 Prüf Bits! |
||
between angels and insects |
- Zuletzt bearbeitet von Jan_ am Do, Jul 14, 2005 8:08, insgesamt einmal bearbeitet
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
du kannst 2 2048er und eine 1024er unterbringen, zB. | ||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
fliege |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
das würde heißen ich habe eine float - variable und könnte damit drei werte bis zu 1024 unterbringen? Kann man da auch Kommazahlen dazunehmen?
Fliege |
||
Wer weiß was kommt.. ? |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
nope. floats sind anders aufgebaut. da ist der verlust massiv, und eine speicherung sehr kompliziert und mit verlusten behaftet. das verfahren ist nur für ints zu empfehlen. | ||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
fliege |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
okay
Danke nochmal Fliege |
||
Wer weiß was kommt.. ? |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group