title image


Smiley ein bischen Theorie zur Bitverknüpfung...
Du solltest dir darüber im klaren sein, was eine Bitverknüpfung ist.



Dazu mußt du die Binärdarstellung der Zahlen kennen.



Hier hab' ich mal die Bit eines halben Bytes mit den entsprechenden Dezimalzahlen dargestellt.

Die Bit werden in diesem Beispiel von links nach rechts gelesen



Dez. Binär

  0   0000

  1   1000

  2   0100

  3   1100

  4   0010

  5   1010

  6   0110

  7   1110

  8   0001

  9   1001

 10   0101

 11   1101

 12   0011

 13   1011

 14   0111

 15   1111





Bei der Bitverknüpfung werden jetzt die Bits der einen Zahl mit den Bits der zweiten Zahl verglichen und je nach Operator die Bits im Ergebnis entsprechend gesetzt.



VB kennt folgende bitweisen Operatoren And, Eqv Imp, Not, Or, Xor



Hier die zugehörigen Verknüpfungstabellen:



And

Var1  Var2 Erg

  0    0    0

  0    1    0

  1    0    0

  1    1    1



Eqv (Gleichheit)

Var1  Var2 Erg

  0    0    1

  0    1    0

  1    0    0

  1    1    1



Imp (Implikation (Var1 in Var2 enthalten))

Var1  Var2 Erg

  0    0    1

  0    1    1

  1    0    0

  1    1    1



Not

Var1 Erg

  0    1

  1    0



Or

Var1  Var2 Erg

  0    0    0

  0    1    1

  1    0    1

  1    1    1



Xor

Var1  Var2 Erg

  0    0    0

  0    1    1

  1    0    1

  1    1    0





Beim bitweisen Or-Operator wird ein Bit also dann im Ergebnis gesetzt, wenn es in irgendeinem oder in beiden der der zu verknüpfenden Zahlen gesetzt ist.

Beim logischen Or wird wirklich der Zahlenwert verglichen. Wann bitweises Or und wann logisches Or gemacht werden soll, erkennt der VB-Interpreter/Compiler am Kontext.

Das ist auch der Grund, warum VB einen logischen Ausdruck nicht "kurzschließen" kann (siehe Anhang)





Wenn man jetzt beispielsweise die Zahlen 2 und 4 bitweise mit Or verknüpft, erhält man das gleiche Ergebnis wie wenn man diese beiden Zahlen addiert oder eben wie bei dir durch zwei logische Or-Vergleiche mit der gleichen Zahl vergleicht



2 Or 4 = 0100 Or 0010 = 0110 = 6 = 2 + 4





Wenn man hingegen die Zahlen 2 und 3 bitweise mit Or verknüpft, ist das nicht mehr der Fall



2 Or 3 = 0100 Or 1100 = 1100 = 3 <> 2 + 3 = 5 = 1010





Wenn du dir schon mal die Werte von Konstanten bei API-Funktionen angesehen hast...

Immer wenn man mehrere Konstanten im gleichen Parameter übergeben kann, braucht man die entsprechenden Konstanten nur addieren.



Hast du dich schon mal gefragt, wie die API-Fkt wissen kann, welche Zahlen du addiert hast?



Das ist ganz einfach: Bitverknüpfung.



Hier beispielsweise für die API GetOpenFileName ein paar der Flags, die bei OPENFILENAME gesetzt werden können:



OFN_READONLY        = 1

OFN_OVERWRITEPROMPT = 2

OFN_HIDEREADONLY    = 4

OFN_NOCHANGEDIR     = 8



Wenn du die Bit's dieser Zahlen ansiehst, wirst du feststellen, daß jede Zahl ein anderes Bit setzt und jede Zahl nur eines. Anhand dieser gesetzten Bits kann man ganz einfach feststellen, welche Zahlen addiert wurden, man braucht ja nur nachsehen, welches Bit gesetzt ist und welches nicht.



Die Konstanten haben die gleichen Werte wie die entsprechenden VB-Konstanten beim Commondialog, da ja das Commondialog-ocx auch nur diese API aufruft.



Alle Konstanten der API's, bei denen mehrere zugleich übergeben werden können, sind so aufgebaut.





Wenn du diese Bedingungen hast, ist es vom Ergebnis her egal, ob du eine Bitverknüpfung machst oder die Zahlen addierst, ansonsten aber nicht.









Anhang: Kurzschließen logischer Ausdrücke:



Darunter versteht man die Fähigkeit einer Programmiersprache, daß die Auswertung verketteter logischer Operationen abgebrochen wird, wenn das Ergebnis bereits feststeht.



Beispiel



Dim a as Boolean

Dim b As Boolean



a = True

b = False

If a = True Or b = True Then





Normalerweise braucht man hier den Teil b = True überhaupt nicht mehr beachten, durch die Auswertung des Teils a = True steht bereits fest, daß die Bedingung bereits True ist, weil ja a schon True ist.

Wie oben bereits gesagt, kann VB das nicht, andere Programmiersprachen, zB C/C++ schon.



Der Grund liegt daran, daß bei C/C++ bei einem logisches Or ein anderer Operator verwendet wird wie beim bitweisen Or. Aufgrund des verwendeten Operators weiß C, ob bitweises oder logisches Or gemeint ist.



Bei VB hingegen wird beim logischen Or der gleiche Operator verwendet wie beim bitweisen Or. Deshalb kann VB nur nach Analyse des gesamten Ausdrucks entscheiden, ob bitweises oder logisches Or gemeint ist.





Eine beliebte Fehlerquelle, über die C-Programmierer oft stolpern wenn sie "mal schnell VB proggen" ist folgende:



Bevor man auf ein Objekt zugreift, sollte man sicherstellen, daß die Objektvariable auch auf ein gültiges Objekt verweist.



Das kann man bei VB mit der Abfrage auf is Nothing machen. Wenn man ein gültiges Objekt hat kann man eine Methode davon aufrufen.



Gesetzt den Fall, man will das gleiche machen, egal ob das Objekt nicht exestiert oder ob die aufgerufenen Methode False zurückgibt, dann hat ein C-Progger gleich diese Zeile geschrieben:





Dim x As Object

'//...



If x Is Nothing Or Not x.Methode(Parameter) Then





Diese vorgehensweise ist in C/C++ gängige Praxis und funktioniert auch einwandfrei, weil C/C++ aufhört, wenn x Nothing ist.

In VB funktioniert das eben nicht, weil VB immer den gesamten Ausdruck auswerten muß, um das Or richtig zu interpretieren.

Folglich will VB eine Methode eines nicht exestierenden Objekts aufrufen, was natürlich zu einem Fehler führt.














Gruß
Gaga

___________________________________________________________________

Profilösungen für VB6
wenn nicht anders angegeben, sind alle Codebeispiele nicht getestet, nur getippt


geschrieben von

Login

E-Mail:
  

Passwort:
  

Beitrag anfügen

Symbol:
 
 
 
 
 
 
 
 
 
 
 
 
 

Überschrift: