Bit Abfrage

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

StarGazer

Betreff: Bit Abfrage

BeitragMo, März 29, 2010 23:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
hoffe daß die Bezeichnung richtig ist ^^

Ich würde gerne wissen wie man abfragen kann, ob ein Bit nicht vorhanden ist.

also in kann in ein Byte x Werte einschreiben
Code: [AUSKLAPPEN]
Variable = 8|16|64


dann abfragen ob dieser auch gesetzt sind
Code: [AUSKLAPPEN]
If Variable & 64 And Variable & 8 then


Aber wie kann man denn abfragen ob sie nicht vorhanden sind ?

mpmxyz

BeitragMo, März 29, 2010 23:29
Antworten mit Zitat
Benutzer-Profile anzeigen
"Not" nutzen?
Beispiel:
BlitzMax: [AUSKLAPPEN]
If Not (a & 64 Or a & 8) ... 'Die Bits für 64 und 8 dürfen hier nicht gesetzt sein.

Wenn das nicht stimmt, musst du wohl dein Problem noch einmal erklären.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

StarGazer

BeitragMo, März 29, 2010 23:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke, es functioniert, aber scheint nicht immer ?
BlitzMax: [AUSKLAPPEN]
If Not (a & 8) And Not (a & 64) Then 


oder wäre es so besser ?
BlitzMax: [AUSKLAPPEN]
If Not (a & 8 And a & 64) Then 


Aber ist denn Not ein gute Lösung ?. Ich dachte man sollte Not immer meiden weil langsam ?
 

Ava

Gast

BeitragDi, März 30, 2010 3:59
Antworten mit Zitat
Warum sollte Not langsam sein ?
Es wandelt doch nur = 0 zu 1 und <> 0 zu 0.
(das binäre Not ist ~ )

Welche Deiner beiden Varianten die "richtige" ist, hängt davon ab, was Du erzielen möchtest. Sie bringen ja unterschiedliche Resultate.

Aber wenn das Ergebnis nicht das ist, was Du erwartest, dann ist es vermutlich die andere Variante. Wink

1) Zitat:
Ja und Ja = Nein
Ja und Nein = Nein
Nein und Nein = Ja

2) Zitat:
Ja und Ja = Nein
Ja und Nein = Ja
Nein und Nein = Ja


Um noch einmal Deine Startfrage aufzugreifen: BlitzMax: [AUSKLAPPEN]
If Variable & 64 And Variable & 8 Then ..
Abfragen, ob sie nicht gesetzt sind: BlitzMax: [AUSKLAPPEN]
If ( Variable & 64 And Variable & 8 ) = 0 Then ..
Was dann wiederum Variante 2) entsprechen würde. Rolling Eyes

StarGazer

BeitragDi, März 30, 2010 14:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Die zweite Variante hat auch nicht functioniert ^^

ok, meine war dann doch etwas anderes
BlitzMax: [AUSKLAPPEN]
If x = False And y = False And ..
Not (a & 8 And a & 64) And ..
Not (b & 4 And b & 16) Then


obwohl "a & 8 = True" war, ist er dennoch in das If reingegangen.

So ganz genau verstehe ich das nicht warum. Nach deinen Zitaten vieleicht nun doch Smile
Ich habe bisher noch nie das Not irgendwo benutzt, daher wohl noch so ne Denksperre Embarassed

Das mit den Klammern ohne Not hatte ich noch nicht probiert, aber ich dachte, das kann kein 0 ergeben, falls noch andere Bits darin gesetzt sind, wodurch die Variable selbst nicht 0 ist.

Hab das mit den Klammern ohne Not ausprobiert, doch es functioniert leider auch nicht ^^
BlitzMax: [AUSKLAPPEN]
If x = False And y = False And ..
(a & 8 And a & 64) = 0 And ..
(b & 4 And b & 16) = 0 Then


x und y sind wirklich False, bevor jetzt die Frage kommt ^^
 

Ava

Gast

BeitragDi, März 30, 2010 16:13
Antworten mit Zitat
Hehe, dann liegt es nach wie vor an der Logik.

(Wert) & (Flag) ergibt immer entweder (Flag) oder 0. Das ist zb. auch wichtig zu wissen, wenn Du so etwas auf True / False checken möchtest. (Wert) & (Flag) ergibt niemals True (1), es sei denn, die Flag ist = 1.

Momentan prüfst Du, ob:

Arrow x und y beide 0 sind
Arrow a Flag 8 oder 64 besitzt
Arrow b Flag 4 oder 16 besitzt

Sind diese 3 Bedingungen alle erfüllt, geht er in den IF-Block.

Wenn Du willst, dass die Bedingung nur erfüllt ist, wenn keine dieser Flags gesetzt ist, dann musst Du sie jeweils einzeln mit 0 vergleichen.

Noobody

BeitragDi, März 30, 2010 16:44
Antworten mit Zitat
Benutzer-Profile anzeigen
StarGazer hat Folgendes geschrieben:
obwohl "a & 8 = True" war, ist er dennoch in das If reingegangen.

Das ist ja logisch (Wortwitz *tusch*) - da du dort ein And stehen hast, überspringt er den If-Block nur, wenn sowohl Flag 8 als auch Flag 64 gesetzt sind.

Wenn du willst, dass er den Block überspringt, wenn eines oder zwei der Flags gesetzt sind, muss du ein Or verwenden BlitzMax: [AUSKLAPPEN]
If x = False And y = False And ..
Not (a & 8 Or a & 64) And ..
Not (b & 4 Or b & 16) Then
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

StarGazer

BeitragDi, März 30, 2010 22:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke euch für eure Anworten.
So langsam verstehe ich das Not besser ^^, es scheint wohl auch das Or und das And umzudrehen.

Jedoch kriege ich es nicht hin. Nur mit meiner unschönen alten Methode klappt es richtig.
BlitzMax: [AUSKLAPPEN]
Local a1,a2
If a & 8 Then a1 = True
If a & 64 Then a2 = True

Local b1,b2
If b & 4 Then b1 = True
If b & 16 Then b2 = True

If x = False And y = False And ..
a1 = False And a2 = False And ..
b1 = False And b2 = False Then
nur wenn wirklich alle False sind, soll er hier rein
EndIf

Das ist aber eine schlechte Lösung finde ich.

All anderen Abfragen machen ab und zu Fehler. Egal wie ich es auch drehe.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group