Ganze Zahl in einzelne Bits zerlegen
Hallo Leute, Ich beschäftige mich gerade mit C++ und will eine positive integer Zahl in ihre einzelnen Bits zerlegen mit den Bit-Operatoren und später auch ausgeben lassen. Da ich Anfängerin bin, habe ich eifrig das Internet durchsucht und nichts verständliches gefunden. Auch an der Literatur versagte ich kläglich.
Kann jemand das einfach veranschaulichen und erklären?
Grüße
6 Antworten
Hallo,
Im Grunde is der Algorithmus ganz einfach. Du musst den Restwertoperator % (Modulo) verwenden und die Zahl immer wieder durch 2 teilen bis nichts mehr übrig bleibt. Beim Teilen kannst Du entweder einfach durch 2 Teilen oder dafür auch den Bitshift operator >> verwenden. Die Bits einer Zahl um eine Stelle nach Rechts zu verschieben ist gleichbedeutend mit durch 2 Teilen.
Um das ganze etwas anschaulicher darzustellen, schau Dir am besten mal auf Youtube dieses Video an. Da wird das ganz einfach Schritt für Schritt vorgemacht. Du musst Dir dann nur noch selber überlegen wie Du das in C++ Code gießt, aber wenn Du den allgemeinen Algorithmus verstanden hast sollte das nicht mehr so schwer sein :) Viel Spaß beim lernen :)
https://www.youtube.com/watch?v=m9KE4l0mC_0
Du findest sicherlich auch gleich den ganzen Code im Netz oder ich könnte ihn Dir aufschreiben, aber dabei lernst Du nichts ;)
Hier der Code in aC[0] :
http://www.gerdlamprecht.de/Roemisch_JAVA.htm##@Na=18897;c=a;@B0]='';b=1;@C0]='';@Nd=sgn(a%20&%20b).toString();@B0]=d+@B0];b=b+b;@C0]=(c%20%25%202).toString()+@C0];c=floor(c/2);@Ni%3E16@N0@N0@N#
(LINK beinhaltet den kompletten Code und endet mit N#)
Ergebnis: aB und aC sind identisch.
Bei Zahlen oberhalb 64Bit (meist als String oder Byte-Array) sind Bitshift und Modulo in der Tat schneller als eine UND-Maske.
Hi. Das ist ganz leicht!
Die Zahl 1234 (Tausend-zwei-hundert-vier-und-dreißig) castest du erstmal in ein float und teilst sie du durch 1000
1234/1000 = 1,234
Diese Zahl castest du einfach wieder als integer
(int)1,234 = 1
und hast das erste bit. Das multiplizierst es wieder mit 1000 und ziehst es von deiner float-zahl ab.
1234 - 1*1000 = 234
jetzt fängt das Spiel von vorne an nur eben mit 100 statt mit 1000.
234/100 = 2,34
(int)2,34 = 2
-
234 - 2*100 = 34
34/10 = 3,4
(int)3,4 = 3
-
34 - 3*10 = 4
4/1 = 4
(int)4 = 4
Die bits sind jetzt also 1, 2, 3, 4. Du musst am Anfang erst aber herausfinden wie du erkennst wie viele Stellen die Zahl überhaupt hast damit du weißt dass du mit 1000 anfängst zu teilen. Wie das geht findest du selber raus :-)
Ich glaub ich hab dich nicht richtig verstanden. Ich hatte gedacht es geht dir nur um die Ziffern.
Ja, und dazu mußt du die Zahlen aus dem Dezimalsystem in das Dualsystem umrechnen - genau das wird dort auch erklärt.
Mit dem Iterationsrechner kann man das leicht veranschaulichen:
http://www.gerdlamprecht.de/Roemisch_JAVA.htm##@Na=18;c=a.toString(2);@B0]='';b=1;@Nd=sgn(a%20&%20b).toString();@B0]=d+@B0];b * =2;@Ni%3E4@N0@N0@N#
(LINK beinhaltet den kompletten Code und endet mit N#)
Da hier das * Zeichen zur Erkennung von Schrägschrift genutzt wird, musste ich bei b * = 2; Leerzeichen zwischenbauen!
Man könnte auch b = b + b schreiben...
Natürlich gibt es fertige Funktionen (hier a.toString(2) also Wandlung nach Binärzahl), aber die Iterationsformel macht die Logik deutlich:
b steht für 2 hoch i, also Ver- UNDet man die Ausgangszahl
(UND - Funktion bedeutet: wenn 2 zu vergleichende Zahlen an der gleichen Bit-Stelle eine 1 haben, bekommt auch das Ergebnis-Bit eine 1 )
Die sgn-Funktion macht aus jeder Zahl größer 0 eine 1.
Fertig.
Nun nur noch Syntax von JavaScript nach c++ anpassen.

zahl & 1 liefert dir das letzte Bit
zahl & 2 das vorletzte
zahl & 4 das drittletzte
...
nur warum? liegt das daran, dass der Orperator & (bitweise AND) die zahl und die angegebene ziffer mit und verrechnet? und warum zeigt zahl & 4 nur das drittletzte bit an und die restlichen nicht???
Lassen wir mal irgendwelche Führungsbits usw. weg, dann wird eine Zahl, in der die 4 enthalten ist, als ...XXXX1XX binär dargestellt. X können beliebig 0 oder 1 sein. Eine Und-Verknüpfung bezeichnet man als "Maskieren". Wenn ich mit ...000100 bitweise Und verknüpfe, wird jedes X mit 0 und verknüpft und das ergibt 0. Steht an der drittletzten Stelle eine 1, wird 1 mit 1 und verknüpft = 1, steht dort eine 0, bekommst du 0. Du bekommst also entweder ...000000 oder ...0000100 als Ergebnis, je nachdem, ob 4 ein Summand der Integerzahl ist.
Das ist nicht das Problem. Ich will eine Zahl, sagen wir mal 123 in ein Programm eingeben und das Programm gibt mir diese Zahl im Binärcode aus. Also die Zahl 123 mit 1'sen und 0'en darstellen.