Seite 1 von 1

Zahlen/Optionen zusammenfassen und wieder trennen

Verfasst: 11.09.2011 21:47
von Sicro
Zahlen zusammenfassen und wieder trennen:

Code: Alles auswählen

; ## Vier Zahlen zu einer Zahl packen ##
; ======================================

; Maximaler Wert der einzelnen Zahlen
MaxValue = 90

; Zuweisung der einzelnen Zahlen
Value_A = 50
Value_B = 30
Value_C = 9
Value_D = 38

; Packen der einzelnen Zahlen
RetVal.q = (Value_A * Int(Pow(MaxValue + 1, 3)))
RetVal   + (Value_B * Int(Pow(MaxValue + 1, 2)))
RetVal   + (Value_C * (MaxValue + 1))
RetVal   + Value_D

; Alle Zahlen sind nun in RetVal
Debug RetVal ; = 37927837



; ## Eine Zahl zu vier Zahlen entpacken ##
; ========================================

; Entpacken der einzelnen Zahlen
Value_A = RetVal / Int(Pow(MaxValue + 1, 3))
RetVal % Int(Pow(MaxValue + 1, 3))

Value_B = RetVal / Int(Pow(MaxValue + 1, 2))
RetVal % Int(Pow(MaxValue + 1, 2))

Value_C = RetVal / (MaxValue + 1)
RetVal % (MaxValue + 1)

Value_D = RetVal

; Alle Zahlen sind wieder vorhanden
Debug Value_A ; = 50
Debug Value_B ; = 30
Debug Value_C ; = 9
Debug Value_D ; = 38
Optionen zusammenfassen und einzeln abfragen:

Code: Alles auswählen

; Hier legen wir fest, was alles zur Verfügung steht
Enumeration 
  #Pommes    = 1
  #Hamburger = 2
  #Cola      = 4
  #Fanta     = 8
  #Alles     = 16
EndEnumeration

Define Kunde_Bestellung.l

; Der Kunde sucht aus ...
Kunde_Bestellung | #Hamburger | #Cola

; Wir fragen die Bestellung ab
If Kunde_Bestellung & #Pommes
  Debug "Kunde möchte Pommes."
EndIf

If Kunde_Bestellung & #Hamburger
  Debug "Kunde möchte ein Hamburger."
EndIf

If Kunde_Bestellung & #Cola
  Debug "Kunde möchte eine Cola."
EndIf

If Kunde_Bestellung & #Fanta
  Debug "Kunde möchte eine Fanta."
EndIf

If Kunde_Bestellung & #Alles
  Debug "Kunde möchte Pommes, einen Hamburger, eine Cola und eine Fanta."
EndIf

Re: Zahlen/Optionen zusammenfassen und wieder trennen

Verfasst: 11.09.2011 22:02
von STARGÅTE
Hm, problem für das Beispiel 1 ist jedoch, dass du um an Value_D zu kommen, immer erst alle andere zahlen ermitteln musst.

Hier wäre ein echter Bit-Shift besser, wenn man zum Beispiel eine Quad in ein Array aus 8 Bytes spaltet:

Code: Alles auswählen

Structure ByteArray
	b.b[0]
EndStructure

Procedure GetByte(*Quad.ByteArray, Index.i)
	ProcedureReturn *Quad\b[Index]
EndProcedure

Procedure SetByte(*Quad.ByteArray, Index.i, Value.b)
	*Quad\b[Index] = Value
EndProcedure

Define Quad.q

SetByte(@Quad, 0, 50)
SetByte(@Quad, 1, 50)
SetByte(@Quad, 4, 9)
SetByte(@Quad, 6, 38)

Debug Quad

Debug GetByte(@Quad, 0)
Debug GetByte(@Quad, 1)
Debug GetByte(@Quad, 4)
Debug GetByte(@Quad, 6)
Ähnliches kann man mit auch Long, Word usw. machen.