Word Bit auslesen

Limette

Level-2
Beiträge
282
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Hallo,

habe ein word oder dword, in dem ich ein byte array mit 30 bools reinkopiert habe. so weit so gut.
nun würde ich gerne -flexibel- ein bit aus dem word auslesen oder abfragen ist es gesetzt oder nicht.
ich denke nicht dass ich der erste bin der soetwas frägt...hat jemand ein kleines Beispiel parat ? :D
habs mit "SHR_DW" und einem Vergleicher probiert, funktioniert aber so glaub nicht.
 
Hallo,

was verstehst du unter flexibel?
Ich würde das mit der AT Sicht und einem Index in SCL lösen...

Grüße
 
naja, viel ists nicht. ^^
mit der bitnummer entsprechend die bytes verschieben. wenn ich bit 5 will muss ich dann Bitnummer = 5 nehmen ?
danach vergleiche ich die verschobene Worddatei mit 1. kann man das so vergleichen ?

Code:
U( 
L #BitNummer
L #Worddatei
SRD 
T #Worddatei
SET 
SAVE 
CLR 
U BIE
) 
U( 
L #Worddatei
L 1
==D 
) 
= #_OK
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... Die restlichen Bits vor dem Vergleich noch mit AND ausmaskieren ...
Ich denke, der Vergleich mit 1 kann meistens noch nicht funktionieren, da ja die restlichen, nicht weggeschobenen Bits auch 1 sein können. Deswegen musst Du die restlichen Stellen mit einem UD auch auf Null setzen.

Und zur Sicherheit - Bit 5 ist dann das 6. Bit, ja?
 
ja, alle Bits die nicht benötigt werden, mit Null verANDen. Also hier L #Worddatei, L #1 und anschließend UD, dann bleibt nur daß 1.Bit übrig, und Du kannst kontrollieren, ob es gesetzt ist.

Da wir aber gerade einen ähnlichen Thread hatten - Du kannst Dein DWORD auch einfach in ein MD kopieren, die entsprechenden Stellen schieben und dann prüfen, ob Mx.0 gesetzt ist.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
So in etwa:

Code:
IN: m_dword Typ dword
IN: bitnr Typ word
RETURN: Ret_val Typ bool

Code:
      L     #bitnr
      DEC   1
      L     #m_dword
      SRD   
      L     2#1
      UD    
      L     2#1
      ==I   
      =     #RET_VAL

gruß
roadrunner

so richtig funktioniert es nicht -> die trefferquote ist leider nicht 100%.
das erste bit, also bitnr = 1 klappt auf jeden fall nicht. :(

um eine flexible maske zu bekommen, müsste man die bitnr immer quatrieren oder nicht? also 2^0 -> 2^1 -> 2^2 usw.... ? in scl müsste sowas ja gehen..
 
so richtig funktioniert es nicht -> die trefferquote ist leider nicht 100%.
das erste bit, also bitnr = 1 klappt auf jeden fall nicht. :(

um eine flexible maske zu bekommen, müsste man die bitnr immer quatrieren oder nicht? also 2^0 -> 2^1 -> 2^2 usw.... ? in scl müsste sowas ja gehen..

Poste mal deinen Baustein oder ev. einen Screenshot.

Ich habe den Code vorhin kurz getestet, da hat auch die Auswertung der 1. Bits in dem DWORD funktioniert.

gruß
roadrunner
 
@volker: Sorry, aber da ist dir ein kleiner Fehler unterlaufen: l 2#11 wäre NICHT w#16#0002, sondern w#16#0003

Zur Bitnummer: Seid ihr euch einig über die Definition dessen, was die Bitnummer bedeuten soll? Ist die Nummer 1 das Bit 0 oder das Bit 1? roadrunners code definiert "1" als das niederwertigste Bit.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
...
Zur Bitnummer: Seid ihr euch einig über die Definition dessen, was die Bitnummer bedeuten soll? Ist die Nummer 1 das Bit 0 oder das Bit 1? roadrunners code definiert "1" als das niederwertigste Bit.
Glaub nicht:
...
Und zur Sicherheit - Bit 5 ist dann das 6. Bit, ja?
jup.
...
...
Code:
...
Code:
      L     #bitnr
      [COLOR=#ff0000]DEC   1[/COLOR]
...
...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
//_________________________________________________
// *** zum testen
L MD 404
TAD // Reihenfolge der Byte drehen (evtl. musst du die Reihenfolgen nicht drehen, ja nachdem wie sie bereits drinstehen)
RRD 16 // Worte Tauschen
T #DWordDatei // DWORD-Variable im Lokaldatenbeieich laden
//_________________________________________________

//_________________________________________________
// *** Abfrage
LAR1 P##DWordDatei // Adressoffset laden
L BitNummer // Die Bitnummer wählen (bei DWORD 0..31) (bei WORD 0..15)
+AR1 // Die Bits zum Adressregister addieren
U L [AR1,P#0.0] // auf die Bitnummer zugreifen (hier lokaldaten)
= #OK
//_________________________________________________

Falls du noch mehr mit dem Adressregister machst das sichern (vorher) und wiederherstellen (nach dem zugriff) nicht vergessen.
 
Zuletzt bearbeitet:
//_________________________________________________
// *** zum testen
L MD 404
TAD // Reihenfolge der Byte drehen (evtl. musst du die Reihenfolgen nicht drehen, ja nachdem wie sie bereits drinstehen)
RRD 16 // Worte Tauschen
T #DWordDatei // DWORD-Variable im Lokaldatenbeieich laden
//_________________________________________________

//_________________________________________________
// *** Abfrage
LAR1 P##DWordDatei // Adressoffset laden
L BitNummer // Die Bitnummer wählen (bei DWORD 0..31) (bei WORD 0..15)
+AR1 // Die Bits zum Adressregister addieren
U L [AR1,P#0.0] // auf die Bitnummer zugreifen (hier lokaldaten)
= #OK
//_________________________________________________

Falls du noch mehr mit dem Adressregister machst das sichern (vorher) und wiederherstellen (nach dem zugriff) nicht vergessen.

Diese Lösung ist auch ein sehr guter Ansatz. :D

Die Frage ist nur welches Bit Limette als welches abfragen möchte. ;)

DWORD.JPG
 
Zuletzt bearbeitet:
Zurück
Oben