Fragen zu Codeschnippsel
-
Value ist aber eine Ganzzahl, z.b. 31. Wieso wird das umgewandelt in Binär?
-
DANrul81 schrieb:
Value ist aber eine Ganzzahl, z.b. 31. Wieso wird das umgewandelt in Binär?
Hier wird nichts umgewandelt. Jede Zahl ist für deinen Computer binär. Wenn du was anderes siehst (dez., oct., hex....), ist das eine reine Darstellungssache. Dementsprechend kannst du selbstverständlich Sachen wie Bitoperationen auf Integers anwenden, auch wenn du meinst, sie wären dezimal. Beliebter Denkfehler.
-
Um das mal ganz deutlich darzustellen:
Als 16 - Bit Zahl (short int könnte zB als 16 Bit - Zahl vorliegen) sieht Deine 31 im Speicher so aus:0000000000011111
Wenn das nun um 15 Bit nach links geschoben wird, sieht das so aus:
0000000000000000
Genauso bei einem Schieben um 14, 13 usw. Bit.
Erst wenn man um 4, 3, 2 Bit schiebt, sieht es dann so aus:
0000000000001111
0000000000000111
0000000000000011usw.
Die eins, mit der Du die UND - Verknüpfung machst, sieht immer so aus:
0000000000000001
Und diese UND - Verknüpfung ergibt dann eben eins oder 0, je nachdem, ob in dem verknüpften Wert das rechteste Bit gesetzt ist, oder nicht. Auf diese Weise werden also nach und nach alle Bits des zu testenden Wertes auf die rechteste Stelle geschoben, mit 1 ver-UND-et (Ergebnis ist dann wie gesagt 0 oder 1) und das Ergebnis ausgegeben. So entsteht dann in der Schleife Bit für Bit die Binärdarstellung Deiner Zahl.
Edit:
ich hab immer von 'Schieben nach links' geschrieben, gemeint ist natürlich 'Schieben nach rechts'
-
Es wird nicht wirklich in Binär umgewandelt, sondern dein %d bekommt eine 1 wenn das geshiftete Bit gesetzt ist. Es wird dann Bit für Bit gesshifet und eine 1 ausgegeben wenn es gesetzt ist.
Bin, Dez, Hex, Okt sind alles immer nur Anzeigeformen(Codierung) für einen Wert im Speicher, ob ich einen Wert als Hexzahl, dezimal oder als Char speichere ändert an dem Wert nichts. 65, 'A', 0x41, 01000001 sind alles dieselben Werte.
Gruß Chris
P.S.: Ups da waren einige schneller
-
Ich halte das für eine schlechte Vorstellung, dass die Zahlen intern unbedingt binär gespeichert sein müssen. Man kommt mit dieser Darstellung nie in Berührung, man kann nicht einmal theoretisch auf diese Darstellung zugreifen (-> Welches Geräusch macht ein fallender Baum, wenn ihn niemand hören kann?). Sie erklärt bloß ein paar der "magischen" Zahlen die in der Computertechnik immer wieder auftauchen. Besser ist es sich vorzustellen, dass der Computer den Wert einer Zahl speichert, nicht eine bestimmte Darstellung. Dann hat auch das Argument hier im Thread viel mehr Schlagkraft. Diese Werte können dann meinetwegen in Einheiten von Bytes organisiert sein. Auf die kann man einzeln zugreifen und sehen, dass dies tatsächlich so ist.
-
SeppJ schrieb:
Ich halte das für eine schlechte Vorstellung, dass die Zahlen intern unbedingt binär gespeichert sein müssen. Man kommt mit dieser Darstellung nie in Berührung, man kann nicht einmal theoretisch auf diese Darstellung zugreifen ...
Sie werden aber binär gespeichert. Zumindest in allen üblichen Computern* heutzutage. Dafür hat jedes Bit sogar mindestens einen Transistor.
Und wenn man mit IO/µControllern zu tun hat, greift man auf diese Darstellung sehr wohl zu. Und wenn es nur der Parallelport ist.* Quanten-Computern sind nicht üblich
.
-
Da hat SeppJ recht, auch wenn heutige CPU binär arbeiten bedeutet dies ja nicht dass alle Recheneinheiten das bis in alle Ewigkeit so machen müssen.
Kurz, der Wert muss nix mit der Darstellung dessen zu tun haben.
-
O.k. Danke für die Hilfe, das habe ich verstanden.
ABER: Wieso kann ich dann nicht die Zahl direkt vergleichen? Also beispielsweise:
printf("%d",( (value &1));
oder:
printf("%d",( (value &1111111111111111));
EDIT: Das konnte ich mir glaube ich selber beantworten:
Beim ertsen wird er mir jedesmal eine 1 ausgeben, da ja jedesmal nur 31 mit 1 verglichen wird.Nur das zweite verstehe ich nicht, dass es nicht funktioniert.
-
1111111111111111 ist eine Dezimalzahl, etwas über 1016( Eine Billiarde Einhundertelf Billionen Einhundertelf Milliarden Einhundertelf Millionen Einhundertelf Tausend Einhundertelf )
Binär ist das 11111100101000110010110111000101010111000111000111C kennt keine Binärdarstellung (außer bei strtol() mit Basis 2)
Das & ist auch kein Vergleich sondern ein Binäres UND.
An den Stellen an denen die Bits in beiden Werten gesetzt sind, bleiben sie gesetzt. 1 UND 1 ergibt 1
-
Belli schrieb:
Um das mal ganz deutlich darzustellen:
Als 16 - Bit Zahl (short int könnte zB als 16 Bit - Zahl vorliegen) sieht Deine 31 im Speicher so aus:0000000000011111
Wenn das nun um 15 Bit nach links geschoben wird, sieht das so aus:
0000000000000000
Genauso bei einem Schieben um 14, 13 usw. Bit.
Erst wenn man um 4, 3, 2 Bit schiebt, sieht es dann so aus:
0000000000001111
0000000000000111
0000000000000011usw.
Muss das nicht "nach rechts" heissen?? Und dann 1, 2, 3 Bit?? oder habe ich da was falsch verstanden??
-
Shift in C schrieb:
Belli schrieb:
[...]
Muss das nicht "nach rechts" heissen?? Und dann 1, 2, 3 Bit?? oder habe ich da was falsch verstanden??
Es muss natürlich nach rechts heißen. Habe ich auch in meinem Posting korrigiert, einfach Posting bis zum Ende lesen.
Aber wieso 1, 2, 3 Bit? Wenn man 15, 14, 13, ... schiebt, dann kriegt man die richtigen Ziffern der Bitdarstellung in der richtigen Reihenfolge von links nach rechts, und kann sie einfach hintereinander ausgeben.
-
Belli schrieb:
Aber wieso 1, 2, 3 Bit? Wenn man 15, 14, 13, ... schiebt, dann kriegt man die richtigen Ziffern der Bitdarstellung in der richtigen Reihenfolge von links nach rechts, und kann sie einfach hintereinander ausgeben.
Wenn man:
0000000000011111 >> 1 codiert erhält man doch: 0000000000001111
Du schriebst:Belli schrieb:
Erst wenn man um 4, 3, 2 Bit schiebt, sieht es dann so aus:
0000000000001111
0000000000000111
0000000000000011Wenn ich es richtig vertanden habe, ist es egeal in welche Richtung ich das verschiebe - aus 4, 3, 2 wird nie diese angegebene Reihenfolge. Es müsste doch 1, 2, 3 heissen - oder?
-
Du hast wieder so halb recht. Ich wollte eigentlich folgendes schreiben:
Erst wenn man um 4, 3, 2 Bit schiebt, sieht es dann so aus:
0000000000000001
0000000000000011
0000000000000111usw.
(ich hoffe, ich hab nicht wieder einen anderen Flüchtigkeitsfehler drin)
Man muss die Shift-Operation natürlich immer auf den Ursprungswert (und nicht etwa auf die Zwischenergebnisse) anwenden.
So bekommt man dann letztendlich die Binärziffern in der richtigen Reihenfolge.
Das ist wohl die Methode, die in dem Codefetzen des TE angewandt werden soll.