bit verknüpfungen: seltsames verhalten
-
hi!
man betrachte folgenden source code:unsigned a = 0; if (~a & 0xF == 0xF) printf("true\n"); else printf("false\n"); a -= 40; if (a & 0xF == 0xF) printf("true\n"); else printf("false\n");
wieso krieg ich
true
falseanstatt
true
trueals output???
bitte um hilfe
danke sehr
-
Weil a & 0xF == 0 ist.
"~" beim 2-ten if vergessen?
Jockel
-
nein, denn beim 2. if ist das höchstwertige bit ohnehin F, weil durch -=40 eine Bereichsunterschreitung aufgetreten ist!
-
Ich weiss zwar eh nicht was das ganze soll, aber debug doch einfach:
a = 0xffffffd8
Wie das == 0x0000000f werden soll, weiss ich nicht.
Jockel
-
eben... ich bin vor ein paar Minuten selbst draufgekommen, dass es natürlich mit 0xF0000000 verknüpft werden muss!!!außerdem muss die & Verknüpfung in ein Klammernpaar gefasst werden...
das problem ist hiermit gelöst
thx
/dev/null
-
Ich weiss nach wie vor nicht was du machen willst,
aber irgendwie hab ich das Gefühl, dass du a auf < 0 überprüfen
willst ?!
Falls ja, dann ist das Quatsch.Jockel
-
doch, du liegst schon richtig, allerdings ist es in meinem fall kein quatsch:
Ich schreibe einen Hexeditor der files bis zu 4 GB aufmachen kann (max UINT wertebereich). wenn ich die cursorposition um eine größere anzahl von bytes dekrementiere muss ich vorher abfragen ob das überhaupt noch geht oder ob ich schon oben angelangt bin (und andere berechnungen auch noch). Das kann ich in meinem fall nicht durch ein einfaches < 0 lösen weil das logischerweise bei UINT niemals eintritt. Und genau deshalb habe ich mir dieses verfahren überlegt - und das funktioniert auch bestens!
mfG
matthias
-
int pos; int decrement; if (decrement > pos) pos = 0; else pos -= decrement;
??
-
Kann nicht funktionieren!
Kann es sein, dass du 0x80... (also binär 1000...) statt
0xF0...(binär 1111000...) haben willst?Jockel
-
nein, ich gehe davon aus dass der zu subtrahierende wert nicht sooo rießig ist, dass es die bits bis ganz vorne betrifft