Vier Byte-Variablen zu einem Interger zusammenrechnen

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

#Reaper

Newsposter

Betreff: Vier Byte-Variablen zu einem Interger zusammenrechnen

BeitragFr, Feb 15, 2008 16:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Also, ich stehe mal wieder vor einem kleinem Problem.
Der Topic dürfte recht aussagekräftig sein.
Ich habe 4 einzelne (Byte)-Variablen (bzw. sind die 4 Zahlen in einem Array), welche ich wieder zu einer einzigen Integer-Variable zusammenführgen/rechnen will. Nur weiß ich leider nicht, wie sich das ordentlich anstellen lässt.
Bzw. ist das etwas ungenau beschrieben: Ich habe alle 4 Bytes eines Integers (bzw. DWords) einzeln.

Also lösbar wäre das z.B. so:
Code: [AUSKLAPPEN]
Print Int("%"+ String(Int(Bin(254))) + String(Int(Bin(255))))


Ging das nicht auch "schöner"? ^^

Danke für eure Mühe Smile

MfG
#Reaper
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7
  • Zuletzt bearbeitet von #Reaper am So, Feb 17, 2008 15:43, insgesamt einmal bearbeitet
 

c64

BeitragFr, Feb 15, 2008 18:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Obs schöner is sei dahingestellt, es ist zumindest eine andere möglichkeit.

Hab gleich n performancetest gemacht, bei wenig schleifen is es schneller ... eigenartig das es bei mehreren langsamer wird.

Code: [AUSKLAPPEN]



Global IB:Byte[]
        IB=[Byte(255),Byte(254),Byte(000),Byte(000)]

For e=1 To 3

Select e
Case 1 cnt=10000
Case 2 cnt=25000
Case 3 cnt=50000
End Select

Print cnt+" Durchläufe"


t=MilliSecs()
For c=1 To cnt
IntBytesToInt(IB)
Next
Print MilliSecs()-t +" millisecs"
Print IntBytesToInt(IB)


t=MilliSecs()
For c=1 To cnt
x=Int("%"+ String(Int(Bin(254))) + String(Int(Bin(255))))
Next
Print MilliSecs()-t +" millisecs"

Print x

Print "---------------------------------------------------"


Next




Function IntBytesToInt:Int(Bytes:Byte[])

         rb=CreateBank(5)
   
         PokeByte rb,1,Bytes[0]
         PokeByte rb,2,Bytes[1]
         PokeByte rb,3,Bytes[2]
         PokeByte rb,4,Bytes[3]
                  
          Return PeekInt (rb,1)

EndFunction


mfg
c64
Betreten verboten! Kinder haften für ihre Eltern!

FOODy

BeitragFr, Feb 15, 2008 18:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Einfach Shl verwenden:
Code: [AUSKLAPPEN]
SuperStrict
Framework brl.standardio
Import brl.retro

Print Int("%"+ String(Int(Bin(254))) + String(Int(Bin(255))))
Print (254 Shl 8)+(255)

Print Int("%"+ String(Int(Bin(252))) + String(Int(Bin(253))) + String(Int(Bin(254))) + String(Int(Bin(255))))
Print (252 Shl 24)+(253 Shl 16) +(254 Shl 8)+(255)


Gruß,
FOODy
BlitzMax + MaxGUI, 64-bit Arch Linux: Intel Core² E8500 | 8 GB Ram | GeForce GTX 460 · 1024 MB
 

#Reaper

Newsposter

BeitragFr, Feb 15, 2008 19:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Auf die Idee mit der Bank hätte ich auch kommen können, wo es doch eh so nahe lag (bei meinem Proggi).
Und das es am Anfang schneller ist, liegt wohl an einem Momory-Leak, oder soetwas. Dreht man die Reihenfolge um (also von vielen Schleifen zu wenigen), sieht das schonwieder etwas anders aus Wink

Ich hatte auch gehofft, das soetwas wie FOODy es gepostet hat, möglicht ist, und das ist es nun zum Glück auch^^
FOODy seine Methode ist nämlich am schnellsten, schlägt mit 0 ms zu Wink

Bzw, sieht das bei mir so aus:

Code: [AUSKLAPPEN]
[b]500000[/b] Durchläufe
28022 millisecs
65279
1136 millisecs
65279
1 millisecs
65279
---------------------------------------------------
25000 Durchläufe
2838 millisecs
65279
56 millisecs
65279
0 millisecs
65279
---------------------------------------------------
10000 Durchläufe
1180 millisecs
65279
23 millisecs
65279
0 millisecs
65279



Danke euch beiden! Smile
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7
 

E. Urbach

ehemals "Basicprogger"

BeitragSa, Feb 16, 2008 10:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Anmerkung: Die Variante von c64 ist wegen Little/Big Endian nicht portabel, deshalb solltest du auf jeden Fall Shl verwenden.
The box said, "Requires Windows XP or better", so I installed Ubuntu | Linux is NOT Windows
Flua :: Profiler für BB und BMax :: Partikel-Engine für BMax :: Lyphia-Projekt Quellcode (BMax) :: Automatische Parallelisierung :: Meine Musik

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group