Frage zum bitweisen Vergleich ('&'-Operator)

vfl_freak

Premium-User
Guten Morgen,

ich versuche derzeit ein Uralt-Projekt, dass bislang mit VC++ 6.0 bearbeitet wurde, unter VS 2010 (Testversion) an Laufen zu bekommen ... :rolleyes:

Jetzt hänge ich an einer speziellen Stelle im Code, von der mir nicht wirklich klar wird, was sie genau macht ... :-(
C++:
long lLizFlag;              // ist mit einem aktuellen Wert belegt   
long m_lLicenseNSLAktuell;  // ist mit abhängigen Default-Wert belegt
...
bool bLizCheck = true;
...
if( lLizFlag  > 0 )
{
    bLizCheck = (lLizFlag & m_lLicenseNSLAktuell) == lLizFlag;  // was genau macht denn hier der Bitvergleich ? ? ?
}

Das der 2010-Compiler keinen Operator kennt, der "... linksseitig einen long-Wert akzeptiert ...", kann ich ja noch nachvollziehen (wenngleich mich dann auch wundert, dass das unter VC++ 6.0 scheinbar kein Problem ist) ...

Aber was macht denn diese Stelle genau :confused:
Wird hier etwa der gesamte long-Wert bitweise verglichen?

Wäre dies nicht eigentlich das Gegebene :confused:
C++:
if( lLizFlag != m_lLicenseNSLAktuell )
{
    bLizCheck = false;
}

BTW: das Ganze sind Altlasten von einem ehemaligen Kollegen ... :suspekt:

Danke und Gruß
Klaus
 
Zuletzt bearbeitet von einem Moderator:
Dort wird tatsächlich geschaut, ob die Bits, die in m_lLicenseNSLAktuell gesetzt sind, auch in lLizFlag gesetzt sind. Dein if ist nicht das gleiche. Der Unterschied liegt darin, dass bei der bitweisen Unterscheidung auch andere Bits gesetzt sein dürfen, beim != nicht!
 
Moin Tim,

Danke für die schnelle Antwort :)

Dort wird tatsächlich geschaut, ob die Bits, die in m_lLicenseNSLAktuell gesetzt sind, auch in lLizFlag gesetzt sind. Dein if ist nicht das gleiche. Der Unterschied liegt darin, dass bei der bitweisen Unterscheidung auch andere Bits gesetzt sein dürfen, beim != nicht!

na gut, aber sie die beiden long-Werte dann nicht zwangsläufig ungleich, wenn auch nur ein einzelnes Bit anders gesetzt ist :confused:

Gruß
Klaus
 
Hi.
na gut, aber sie die beiden long-Werte dann nicht zwangsläufig ungleich, wenn auch nur ein einzelnes Bit anders gesetzt ist :confused:
Nein, es geht um die Frage ob genau die Bits die in lLizFlag gesetzt sind auch in m_lLicenseNSLAktuell angeschaltet sind. Andere Bits (die evtl. noch zusätzlich) in m_lLicenseNSLAktuell sind uninteressant.

Allerdings sollte der Ausdruck kein Problem darstellen. Wie lautet die genaue Fehlermeldung?

Gruß
 
Moin deepthroat,

Nein, es geht um die Frage ob genau die Bits die in lLizFlag gesetzt sind auch in m_lLicenseNSLAktuell angeschaltet sind. Andere Bits (die evtl. noch zusätzlich) in m_lLicenseNSLAktuell sind uninteressant.
hmm, beides sind doch long-Werte und sollte somit gleichgroß (4 byte lang) sein :confused:
was sollten denn da für 'andere Bits' gesetzt sein :rolleyes:

Allerdings sollte der Ausdruck kein Problem darstellen. Wie lautet die genaue Fehlermeldung?
Ich bekomme beim VS 2010 den Compilerfehler C2678
Code:
Binärer Operator 'Operator' : Kein Operator definiert, der einen linksseitigen Operator vom Typ 'long' akzeptiert (oder keine geeignete Konvertierung möglich)
Lt einen Hinweis unter VC++ 6.0 sind dies Fehler, die mit älteren Compilern nicht erkannt wurden .....
Bei VS2010 steht noch der Hinweis, das der Fehler auftreten kann, wenn "sie einen systemeigenen Member nicht fixieren, bevor Sie eine der Memberfunktionen aufrufen" ..... :Bahnhof: :rolleyes:

Gruß
Klaus
 
Zuletzt bearbeitet:
hmm, beides sind doch long-Werte und sollte somit gleichgroß (4 byte lang) sein :confused:
was sollten denn da für 'andere Bits' gesetzt sein :rolleyes:
a = 7
b = 3

In a sind die 3 niederwertigsten Bits angeschaltet, in b sind nur die 2 niederwertigsten Bits angeschaltet.

(a & b) == b => true -- alle Bits die in b angeschaltet sind, sind auch in a angeschaltet, zusätzlich ist in a noch ein weiteres Bit angeschaltet.
Ich bekomme beim VS 2010 den Compilerfehler C2678
Code:
Binärer Operator 'Operator' : Kein Operator definiert, der einen linksseitigen Operator vom Typ 'long' akzeptiert (oder keine geeignete Konvertierung möglich)
Lt einen Hinweis unter VC++ 6.0 sind dies Fehler, die mit älteren Compilern nicht erkannt wurden .....
Ich kann keinen Fehler entdecken. Dein Code kompiliert bei mir mit VS 2010 wunderbar. Bist du sicher, dass da nicht irgendwelche Makros dazwischen funken? Lass dir doch mal den vorverarbeiteten Code ausgeben.
Bei VS2010 steht noch der Hinweis, das der Fehler auftreten kann, wenn "sie einen systemeigenen Member nicht fixieren, bevor Sie eine der Memberfunktionen aufrufen" ..... :Bahnhof: :rolleyes:
Das betrifft nur C++/CLI.

Gruß
 
Moin,

In a sind die 3 niederwertigsten Bits angeschaltet, in b sind nur die 2 niederwertigsten Bits angeschaltet.
(a & b) == b => true -- alle Bits die in b angeschaltet sind, sind auch in a angeschaltet, zusätzlich ist in a noch ein weiteres Bit angeschaltet.
ah, ok, jetzt wird mir auch das Umfeld der Prüfung etwas klarer - das werden wohl Daten von internen Lizenzen verglichen ....

Ich kann keinen Fehler entdecken. Dein Code kompiliert bei mir mit VS 2010 wunderbar. Bist du sicher, dass da nicht irgendwelche Makros dazwischen funken? Lass dir doch mal den vorverarbeiteten Code ausgeben.
Makros glaube ich nicht ....
[EDIT]
Ich habe aber in der (endlos langen :-() Fehlerliste noch folgende Warnung für die Source stehen:
_WIN32_WINNT not defined. Defaulting to _WIN32_WINNT_MAXVER (see WinSDKVer.h)
Das mir das nichts sagte (und bislang dazu auch nichts gefunden habe) habe ich dies erstmal hinten angestellt ...
[/EDIT]

Was genau meinst Du denn mit "vorverarbeitet" :confused::confused:

Gruß
Klaus
 
Zuletzt bearbeitet:
Der Code den der Präprozessor ausspuckt... :eek:
Project Properties -> C/C++ -> Preprozessor -> Preprocess to a File
ok, habe ich aktiviert, wo finde ich die Datei anschließend? Im Projektverzeichnis?
Scheint sehr lange zu dauern - poste das Ergebnis später ...

Welche Version vom Compiler verwendest du denn genau?
KA - ist die 30-Tage-Testversion von VS2010 (Version 10.0.30139.1) mit .NET V4.0.30139

\edit: Du hast nicht doch zufällig CLR Unterstützung angeschaltet, oder?!
leider ebenfalls KA :rolleyes:
[EDIT] ist aber wohl lt. Hilfe defaultmäßig deaktiviert ...

Gruß
Klaus
 
Zuletzt bearbeitet:
ok, habe ich aktiviert, wo finde ich die Datei anschließend? Im Projektverzeichnis?
Ja. Dateiendung ".i".
KA - ist die 30-Tage-Testversion von VS2010 (Version 10.0.30139.1) mit .NET V4.0.30139
Warum schaust du denn nicht einfach nach? :confused: "cl" in der VS 2010 Kommandoshell ausführen...
leider ebenfalls KA :rolleyes:
Project Properties -> C/C++ -> General -> Common Language RunTime Support

Wobei dann der Fehler nur bei einer ref class auftreten dürfte.. ?

Gruß
 
Zurück