[C/C++] Verständnisfrage: Bitoperatoren und Hexadezimalzahl

Johnson

Code-Frevler
ID: 118054
L
20 April 2006
859
53
Hi,

erstmal entschuldigung, dass mir kein treffenderer Threadtitel eingefallen ist.

Ich habe hier folgendes Problem (bzw Aufgabestellung).

Ich habe einen 32Bit-Wert (dual) in einer Variable.

Dieser ist wiefolgt aufgebaut: 0000 (Zehnerzifferstunde) 0000 (Einerzifferstunde) , ....

Nun möchte ich die Uhrzeit ausgeben. In der Lösung geschieht das wie folgt:

Code:
// ...
zeit_binaer_hE = zeit_binaer & 0x0F000000; // Stunden-Einer (bcd)

zeit_E = zeit_binaer_hE >> 24;
// ...

Darf ich mir den Ablauf dort nun so vorstellen, dass zuerstmal nur die Bits des zweiten Bitblocks auf 1 gesetzt werden. Dann wird das ganze um den Wert 2^24 verringert (bzw binär betrachtet alles um 24 Stellen nach "rechts" geschoben).

Wenn ja, dann wäre das momentan nach logisch für mich; bei der 2. Aufgabe komme ich aber einfach nicht weiter:

Ich habe einen Kleinbuchstaben. Nun maskiere ich diesen mit $DF und erhalte den passenden Großbuchstaben. In der ASCII-Tabelle wird zwar deutlich, dass man auf den passenden Großbuchstaben kommt, wenn man 32 subtrahiert. Jedoch kann ich da einfach das $DF nirgendwo einbringen.

Weiß jemand wie ich auf $DF komme ?

Gruß
 
Johnson schrieb:
Darf ich mir den Ablauf dort nun so vorstellen, dass zuerstmal nur die Bits des zweiten Bitblocks auf 1 gesetzt werden. Dann wird das ganze um den Wert 2^24 verringert (bzw binär betrachtet alles um 24 Stellen nach "rechts" geschoben).
Der letzte Teil stimmt, der erste nicht.
Mit der AND-Operator wird nur der obere Teil übrig gelassen, nix 1 gesetzt:

Bsp: (ich nehm einfach irgendwelche Werte)
zeit_binaer = 0x45874187
0x45874187 & 0x0f000000 = 0x05000000

Guck dir die Operation im Binärsystem an:
. 01000101 10000111 01000001 10000111
& 00001111 00000000 00000000 00000000
=====================================
. 00000101 00000000 00000000 00000000


Johnson schrieb:
Ich habe einen Kleinbuchstaben. Nun maskiere ich diesen mit $DF und erhalte den passenden Großbuchstaben. In der ASCII-Tabelle wird zwar deutlich, dass man auf den passenden Großbuchstaben kommt, wenn man 32 subtrahiert. Jedoch kann ich da einfach das $DF nirgendwo einbringen.

Weiß jemand wie ich auf $DF komme ?
Hab ich so noch nie gemacht, stimmt aber:

0xdf = 11011111
Guck dir mal den Inverswert an: 00100000, dezimal: 32 ;)

Kapiert ? ;)
 
Aus
zeit_binaer_hE := 00000101 00000000 00000000 00000000
wird nachdem zeit_E = zeit_binaer_hE >> 24; ausgeführt wurde
zeit_E := 00000000 00000000 00000000 00000101

Das kommt einer Division um 2^24 gleich, aber ohne Rest!
Bsp:
11 >> 1 = 01
3/2 = 1 Rest 1

111 >> 2 = 001
7/4 = 1

Integer halt ...
https://de.wikipedia.org/wiki/Gaußklammer

Anders herum ist es eine Multiplikation (man beachte den Typ).
zeit_E = zeit_binaer_hE << 24;

Gruss
0x446F6354726178
 
Zuletzt bearbeitet:
Danke euch beiden, ich glaub jetzt hab ich´s einigermaßen verstanden!

Muss mich nur noch ein bisschen ans Andersdenken gewöhnen :)

Bekommt beide einen grünen Noppel (wenn´s denn geht ;) )
 
Johnson schrieb:
Muss mich nur noch ein bisschen ans Andersdenken gewöhnen :)
Am einfachsten isses immer, dir die Operation binär nochmal hinzuschreiben. Dann verstehst dus immer.

Ich mach dir nochmal Beispiel, wo du siehst, wie einfacher es dadurch wird.

Dezimal
4166402516 & 574894981 = 541327748 (wärst du drauf gekommen ?)

Hexadezimal
Bring alles in Hexsystem, dass du die krumme Basis 10 los hast :mrgreen:
0xf85641d4 & 0x22443385
Von da aus einfach ins Binärsystem bringen. Eine Hexziffer kriegt 4 Binärziffern, mach ja ned alles auf einmal 8O

. 11111000 01010110 01000001 11010100
& 00100010 01000100 00110011 10000101
=====================================
. 00100000 01000100 00000001 10000100

Farbsymbolik klar ? Alles, was in der Maske 0 (rot) hat, kriegt am Ende auch 0:
1 & 0 = 0 und 0 & 0 = 0
Dort, wo die Maske 1 (blau) hat, kommt der Wert von oben durch:
1 & 1 = 1 und 0 & 1 = 0

Mit den anderen Bitoperationen (OR, XOR, NOT, NAND, NOR, NXOR) geht das natürlich auch.
 
theHacker schrieb:
Am einfachsten isses immer, dir die Operation binär nochmal hinzuschreiben. Dann verstehst dus immer.

Ich mach dir nochmal Beispiel, wo du siehst, wie einfacher es dadurch wird.

Danke!

Ja, so habe ich es jetzt auch verstanden :) Nur das Umrechnen von Dezimal in Hexadezimal finde ich noch ein bisschen umständlich ... Mal schaun, ob ich da nen schönes Tool find :)

Danke nochmal!
 
Johnson schrieb:
Danke!

Ja, so habe ich es jetzt auch verstanden :) Nur das Umrechnen von Dezimal in Hexadezimal finde ich noch ein bisschen umständlich ... Mal schaun, ob ich da nen schönes Tool find :)

Danke nochmal!

calc.exe ? wissenschaftliche ansicht? und dort kannst zwischen den zahlensystemen hin und her schalten.
 
theHacker schrieb:
a) das und
b) sag bloß, du hast keinen normalen Taschenrechner, der das kann ? 8O

zu a:
Natürlich weiß ich, dass Windows nen TR hat, hab aber nicht gewusst, dass das Wissenschaftsteil sowas hat ...

zu b:
Der von der Schule ist zu doof für sowas (oder ich habs noch nicht gefunden ^^ / erst in höheren Klassen bekommen wir nen guten) :ugly:

Und ansonsten brauch ich keinen Taschenrechner, der mir zwischen dezimal <=> Hexadezimal rumwechselt ;)
 
Hmm, ich glaub ich hab nochmal ein Problem ... Vielleicht denk ich ja einfach zu viel :ugly: :

Oben wurde ja ein Wert mit $DF maskiert. Ergebnis war Wert - 32 (32 = Inverswert von $DF im Dualsystem).

Nun müsste das doch eigentlich auch mit anderen Zahlen gehen:

9 - 5 = 4

1001
& 1010
-------
1000 (8) ?

Hab ich da irgendwas total falsch verstanden / angewendet ?
 
Johnson schrieb:
Nun müsste das doch eigentlich auch mit anderen Zahlen gehen:
Ne. Diese AND-Operation filtert dir ja nur ein gesetztes Bit 5 (Wert 32) raus, wenn es gesetzt is. Sie entspricht nicht einer Subtraktion von 32 :!:
 
theHacker schrieb:
Ne. Diese AND-Operation filtert dir ja nur ein gesetztes Bit 5 (Wert 32) raus, wenn es gesetzt is. Sie entspricht nicht einer Subtraktion von 32 :!:

Also funktioniert obiges mit der ASCII-Table auch nur, wenn Bit No. 5 gesetzt ist ? Ansonsten gibt er Schrott aus ?

*blitzmerker* :mrgreen:
 
Johnson schrieb:
Also funktioniert obiges mit der ASCII-Table auch nur, wenn Bit No. 5 gesetzt ist ? Ansonsten gibt er Schrott aus ?
Im Beispiel mit dem ASCII-Code wird entweder 32 abgezogen oder der Wert bleibt unverändert (logisch: Anzahl der Möglichkeiten, die das Ergebnis hat, beträgt 2^(gesetzte Bits in der Maske))
 
theHacker schrieb:
Im Beispiel mit dem ASCII-Code wird entweder 32 abgezogen oder der Wert bleibt unverändert (logisch: Anzahl der Möglichkeiten, die das Ergebnis hat, beträgt 2^(gesetzte Bits in der Maske))

Okay, big thx zum x. mal :biggrin: