Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Bitbearbeitung

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
16.05.2004, 12:33 Uhr
~Marco
Gast


Hi,

was ist der Unterschied zwischen


C++:
int i;
if (i&~077) {}



und


C++:
int i;
if (i>64){}




Vielen Dank schonmal

Marco
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
16.05.2004, 14:25 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


beim ersten bildest du das komplement einer zahl (077) und verundest das bitweise mit i... wenn da irgendwas grösser 0 rauskommt ist die bedingung erfüllt...

Beim zweiten ist die bedinung halt erfüllt wenn ich mindestens 65 ist...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
16.05.2004, 21:27 Uhr
ao

(Operator)


Das erste ist ein Bitmuster-Vergleich, das zweite ein Vergleich nach Zahlenwert. Worauf willst du hinaus?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
16.05.2004, 22:51 Uhr
~Queza
Gast


Bei der 1. Anweisung ist die Bedingung erfüllt,
wenn i > 197 ist, oder i < 0 ist.

Bei der 2. Anweisung ist die Bedingung erfüllt,
wenn i > 64 ist.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
17.05.2004, 22:29 Uhr
~Marco
Gast


Hi,

die Zahl 077 soll eine oktale Zahl sein, wenn ich das richtig verstehe.
Naja, worauf will ich hinaus. Ich verstehe die erste Anweisung nicht. Und meine Vermutung war, dass die zweite Anweisung äquivalent zur ersten Anweisung ist. Dies scheint aber nicht der Fall zu sein. Denn, wo ich die erste Anweisung gelesen habe, wird damit versucht zu überprüfen, ob eine Zahl in einem bestimmten Bereich ist.

Könnt ihr mir bitte die erste if-Anweisung genauer erklären.

Danke

Marco
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
17.05.2004, 22:38 Uhr
Pablo
Supertux
(Operator)


077 kann als Binärzahl aufgefasst werden. nämlich als 111111.

~077 ist das bitweise Komplementieren von 077. Das heißt, angenommen wir hätten nur 8-Bit Register, dann wäre ~077=11000000.
i&x ist das bitweise AND von i mit x, sprich angenommen i=5==> im Regsiter i steht 00000101. Dann ist

Code:
0 0 0 0 0 1 0 1
1 1 0 0 0 0 0 0
---------------&
0 0 0 0 0 0 0 0 = 0


also liefert 5&~077 false zurück. Dann ist if(i&~077) äquivalent zu if(0).

Wie du siehst, dann muss i mindestens an der 7. Stelle ein Bit gesetzt haben, damit i&~077 true zurückliefert. Also, i muss größer als 2^7 = 128 sein.

Äquivalent zu if(i&~077) ist dann if(i>127).

ich hoffe, damit ist deine Frage geklärt
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 17.05.2004 um 22:39 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
17.05.2004, 23:04 Uhr
ao

(Operator)



Zitat:
Pablo postete
Wie du siehst, dann muss i mindestens an der 7. Stelle ein Bit gesetzt haben, damit i&~077 true zurückliefert. Also, i muss größer als 2^7 = 128 sein.

Äquivalent zu if(i&~077) ist dann if(i>127).

Beide Aussagen stimmen nicht, bitte noch mal nachrechnen.

077 ist dasselbe wie 00111111 (binär), also 63 (dezimal), nicht 127.

"if (i & ~077) ist äquivalent zu if (i > 63)" stimmt auch nicht, denn die erste Bedingung ist auch wahr für i < 0, wenn die Binärdarstellung für negative Zahlen das Zweierkomplement mit Vorzeichen im höchsten Bit verwendet.

Der letzte Punkt ist eine gefährliche Falle, weil man leicht vergisst, auch an die negativen Zahlen zu denken. Deswegen sollte man es sich zur Gewohnheit machen, Bedingungen möglichst "wörtlich" zu kodieren und nicht in irgendwas anderes zu übersetzen, von dem man glaubt, dass es äquivalent ist. Die Fehler, die aus so was entstehen, sind sehr ärgerlich, weil vermeidbar und damit überflüssig.

Ganz nebenbei ist der Code auch leichter zu lesen, wenn man sich drauf verlassen kann, dass der Programmierer das, was er da getippt hat, auch so gemeint hat und nicht rätseln muss, ob er nicht in Wahrheit was anderes wollte.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
17.05.2004, 23:08 Uhr
Pablo
Supertux
(Operator)


Ach ja, hab mich verzählt und hab 7 statt 6 gezählt. Aber ~077 ist das Komplement von 00111111 und das ist 11000000 und das ist mindestens 2^6 und nicht 2^7 (da habe ich den Fehler gemacht) und das würde mindestens 64 ergeben.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 17.05.2004 um 23:08 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: