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

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

BtbN

Betreff: 2 Variablen in eine packen, und hinterher wieder 2 draus.

BeitragSa, Jun 25, 2005 16:21
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BladeRunner

Moderator

BeitragSa, Jun 25, 2005 16:23
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink
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

BeitragSa, Jun 25, 2005 16:25
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BladeRunner

Moderator

BeitragSa, Jun 25, 2005 16:32
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Jun 25, 2005 16:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Gut, es funktioniert!
Danke.
Aber ich verstehe nicht, warum es das tut.
Könntest du es eventuell erklären?
Biiiiitttttttööööööööööööö!!!!!

BladeRunner

Moderator

BeitragSa, Jun 25, 2005 16:46
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink
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

BeitragSa, Jun 25, 2005 16:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Ah!
Es war verständlich.
Ich hab daraus ma 2 Funktionen gebastelt:

BlitzBasic: [AUSKLAPPEN]
Function twoinone(var1,var2)

var1 = var1 * 65536
da = var1 + var2
Return(da)

End Function


Function twofromone(var,what)

var2 = var And 65535
var1 = (var-var2)/65536
If what = 1 Then
Return var1
Else
Return var2
EndIf

End Function


Die müsten so richtig sein.



BORNtobeNAMELESS
 

David

BeitragSa, Jun 25, 2005 16:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!

BlitzBasic: [AUSKLAPPEN]

a = 30
b = 1000

; packen
c = ( a Shl 16 ) Or b

Print c

; entpacken
a = c And $ffff
b = ( c Shr 16 ) And $ffff

Print a
Print b

WaitKey


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

BeitragSa, Jun 25, 2005 16:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Die andere Variante fand ich besser!
Die hab ich wenigstens verstanden...
 

David

BeitragSa, Jun 25, 2005 16:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!

Is genau das selbe...
Scheinst es nicht verstanden zu haben. ;P

grüße
 

fliege

BeitragMi, Jul 13, 2005 22:29
Antworten mit Zitat
Benutzer-Profile anzeigen
geht das mit belibig vielen variablen?

Fliege
Wer weiß was kommt.. ?
 

Absoluter Beginner

BeitragMi, Jul 13, 2005 22:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein das kommt auf Min-Max an
Also je größer die zahlen desto weniger passen rein
Error Inside!

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragMi, Jul 13, 2005 23:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier noch eine minimal kürzere Version..
BlitzBasic: [AUSKLAPPEN]
a=60000
b=55555
;Packen
versand= a Shl 16 + b
;entpacken
a = versand Shr 16
b = versand And $ffff
;Test
Print A
Print B
WaitKey
[BB2D | BB3D | BB+]
 

fliege

BeitragDo, Jul 14, 2005 7:51
Antworten mit Zitat
Benutzer-Profile anzeigen
bis zu welcher zahl passen denn drei zahlen rein?
Fliege
Wer weiß was kommt.. ?

Jan_

Ehemaliger Admin

BeitragDo, Jul 14, 2005 7:57
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BladeRunner

Moderator

BeitragDo, Jul 14, 2005 7:58
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Jul 14, 2005 8:13
Antworten mit Zitat
Benutzer-Profile anzeigen
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.. ?

BladeRunner

Moderator

BeitragDo, Jul 14, 2005 8:15
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Jul 14, 2005 8:20
Antworten mit Zitat
Benutzer-Profile anzeigen
okay
Danke nochmal

Fliege
Wer weiß was kommt.. ?

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group