Supportnet / Forum / Anwendungen(Java,C++...)
Unäre Operationen
Frage
Hallo Leute,
ich habe da mal ne Frage: Wie genau funktioniert die Unäre Operation?
Also als bsp. ein C Quellcode:
[code]
void main()
{
int e, x=9;
e=~x;
printf("Ausgabe von %d im Unären ergibt: %d",x,e);
}
[/code]
Das ergibt:
[code]Ausgabe von 9 im Ünären ergibt: -10[/code]
Wie kann ich mir das erklären? Ich habe es versucht mit Bitweiser Erklärung da kann ich mir die Neun als Bitmuster so erklären:
[code]9 = 0000 1001[/code]
Die Minus Zehn sieht so aus:
[code]-10 = 1111 1001[/code].
Ich kann mir aber nicht vorstellen das es einfach nur eine "Umdrehung der Bits" ist. Zumal ich gehört habe man müsse da irgendwie noch Plus eins rechnen.
Ich bedanke mich schonmal für eure Hilfe.
©as
Antwort 1 von semi
e=~x; heisst einfach e ist NOT x (Einerkomplement bzw. Negation).
Klartext: Alle Bits von x, nur halt andersrum :-)
Das was Du mit dem +1 meinst, kommt im Zusammenhang mit dem sogenannten Zweierkomplement.
Wird bei Binärsubtraktion benötigt, da Binärzahlen nicht so ohne weiteres subtrahiert werden können, wenn nur das hächste Bit über das Vorzeichen entscheidet. Oder anders ausgedrückt, Subtraktion gibt es im PC nicht. Nur Addition negativer Zahlen
z.B.
12 - 8 = 12 + (-8)
Was passiert.
-8 könnte man binär wie folgt schreiben (höchstes Bit ist Vorzeichen; hier 1 Byte)
1000 1000
--------------------------------------
Lösung:
1) Das höchste Bit von -8 löschen
2) Einerkomplement bilden
3) 1 dazuaddieren
Gruß,
Michael
Klartext: Alle Bits von x, nur halt andersrum :-)
Das was Du mit dem +1 meinst, kommt im Zusammenhang mit dem sogenannten Zweierkomplement.
Wird bei Binärsubtraktion benötigt, da Binärzahlen nicht so ohne weiteres subtrahiert werden können, wenn nur das hächste Bit über das Vorzeichen entscheidet. Oder anders ausgedrückt, Subtraktion gibt es im PC nicht. Nur Addition negativer Zahlen
z.B.
12 - 8 = 12 + (-8)
Was passiert.
-8 könnte man binär wie folgt schreiben (höchstes Bit ist Vorzeichen; hier 1 Byte)
1000 1000
--------------------------------------
0000 1010 (12)
+ 1000 1000 (-8)
-------------------
1001 0010 (-40) !!! geht nicht
Lösung:
1) Das höchste Bit von -8 löschen
2) Einerkomplement bilden
3) 1 dazuaddieren
1000 1000 (-8)
0000 1000 (höchstes Bit gelöscht)
1111 0111 (Negation; Einerkomplement)
1111 1000 (1 dazuaddiert)
Diese Zahl kannst Du zu 12 dazuaddieren
0000 1010 (12)
+ 1111 1000 (-8)
-------------------
(1)0000 0010 (=4)
Gruß,
Michael
Antwort 2 von semi
Ups! Kleiner Fehler. Alles ein Bit weiter, die 12 stimmt nicht :-)
--------------------------------------
Lösung:
1) Das höchste Bit von -8 löschen
2) Einerkomplement bilden
3) 1 dazuaddieren
Jetzt aber. :)
Gruß,
Michael
--------------------------------------
0000 1100 (12)
+ 1000 1000 (-8)
-------------------
1001 0100 (-36) !!! geht nicht
Lösung:
1) Das höchste Bit von -8 löschen
2) Einerkomplement bilden
3) 1 dazuaddieren
1000 1000 (-8)
0000 1000 (höchstes Bit gelöscht)
1111 0111 (Negation; Einerkomplement)
1111 1000 (1 dazuaddiert)
Diese Zahl kannst Du zu 12 dazuaddieren
0000 1100 (12)
+ 1111 1000 (-8)
-------------------
(1)0000 0100 (=4)
Jetzt aber. :)
Gruß,
Michael
Antwort 3 von Casvil
Ja danke ich habe es nun verstanden. aber wie mache ich denn nun dem pc klar, dass ich dass zweierkomplement meine?
danke
schonmal
©as
danke
schonmal
©as
Antwort 4 von Casvil
Ja danke ich habe es nun verstanden. aber wie mache ich denn nun dem pc klar, dass ich dass zweierkomplement meine?
danke
schonmal
©as
danke
schonmal
©as
Antwort 5 von semi
Dies ist bei negativen Zahlen bereits der Fall.
Schau Dir die Ausgane von dem hier an
Gruß,
Michael
Schau Dir die Ausgane von dem hier an
typedef unsigned char byte;
int main()
{
byte a = 8;
a = ~a + 1; // Zweierkomplement bilden; Negieren und 1 dazuaddieren
printf("%x\n", a);
a = -8; // -8 wird bereits als Zweierkomplement dargestellt
printf("%x\n", a);
return 0;
}
Gruß,
Michael