Hallo JAN,
du kannst die BITS einer Zahl direkt setzen, aber Bit 0 ist ganz rechts und Xbase beginnt mit der Zählung bei 1.
Nachdem Martin den richtigen Aufbau gefunden hat, ist die Umsetzung nicht schwer und natürlich geht die Umrechnung nach deiner "rustikalen" Methode genauso wie die mathematische von Tom ... aber ich denke die wirklich binäre Umsetzung (BIT für BIT) ist nicht nur leichter zu verstehen, sondern gerade wenn man den Aufbau noch nicht kennt, kann man so die Zwischenergebnisse besser prüfen und eventuell auch die Regel erkennen. Für sowas nehme ich normalerweise PowerBasic, da dieses native &H für HEX, &B für Binär etc. verarbeiten kann.
Hier meine Funktionen ...
Code: Alles auswählen
#include "Gra.ch"
#include "Xbp.ch"
#include "Common.ch"
procedure main()
local x, y, z, nAdresse, cUG, cMG, cHG
cls
? "Bitschiebereien"
cUG := "........11111111" // leider können wir in Xbase++ keine BINÄREN Werte angeben !
cMG := ".....111........"
cHG := ".1111..........."
x := 3
y := 5
z := 7
? "Interne Darstellung, BIT 0 ist ganz rechts,"
? "bei Xbase Syntax wird aber statt 0 die 1 verwendet: "
?
? "Setzen wir die Werte x,y,z auf 3,5,7 =>"
?
? "X",str(x,10),nWert2Bin16(x)
? "Y",str(y,10),nWert2Bin16(y)
? "Z",str(z,10),nWert2Bin16(z)
?
? "Nun Adresse mit Offsets bilden ... "
?
? "X",str(x*2048,10),nWert2Bin16(x*2048)
? "Y",str(y*256 ,10),nWert2Bin16(y*256)
? "Z",str(z,10),nWert2Bin16(z)
nAdresse := x*2048 + y*256 + z // Multipliziert haben wir ja schon !
? "=",str(nAdresse,10),nWert2Bin16(nAdresse)
?
? "Gruppenzuordnung der Bits, gut wenn man das gefunden hat ;-)"
? "Untergruppe ",cUG
? "Mittelgruppe ",cMG
? "Hauptgruppe ",cHG
?
? "Gegenrechnung ... stimmt !"
?
? "X",str(GetWertVonBin16(nAdresse, cHG ),10)
? "Y",str(GetWertVonBin16(nAdresse, cMG ),10)
? "Z",str(GetWertVonBin16(nAdresse, cUG ),10)
?
Inkey(20)
return
*------------------------------------------------------------------
function nWert2Bin16(nIntWert) // nur 16 Bit / 2 Byte sind relevant
local cStr16, nBit, nCharPos
cStr16 := space(16)
nCharPos := len(cStr16)
for nBit := 1 to 16 // eigentlich ist es ja 0 bis 15, aber bei Xbase 1 bis 16 !
cStr16[nCharPos] := iif(nIntWert[nBit],"1","0")
nCharPos--
next
return cStr16
*------------------------------------------------------------------
function GetWertVonBin16(nBuffer, cBitMaske)
local nWert, nMask, x, nCharPos, nOffset
nCharPos := len(cBitMaske) // ganz rechts steht Bit 0 => hier also 1
nMask := 0 // alle Bits auf 0 setzen
nOffset := NIL
for x := 1 to 16
if cBitMaske[nCharPos] $ "J1Xx" // flexibel bleiben ;-)
nMask[x] := .t. // dieses Bit in der Maske setzen
if nOffset = NIL
nOffset := 2^(x-1)
endif
endif
nCharPos--
next
nWert := BAND(nBuffer,nMask)
nWert /= nOffset
return nWert
und hier die Bildschirmausgabe:
Code: Alles auswählen
Setzen wir die Werte x,y,z auf 3,5,7 =>
X 3 0000000000000011
Y 5 0000000000000101
Z 7 0000000000000111
Nun Adresse mit Offsets bilden ...
X 6144 0001100000000000
Y 1280 0000010100000000
Z 7 0000000000000111
= 7431 0001110100000111
Gruppenzuordnung der Bits, gut wenn man das gefunden hat ;-)
Untergruppe ........11111111
Mittelgruppe .....111........
Hauptgruppe .1111...........
Gegenrechnung ... stimmt !
X 3
Y 5
Z 7