Ganze Zahl in einzelne Bits zerlegen

6 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

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 ;)

hypergerd  07.11.2014, 15:40

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.

0

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 :-)

Bujin  05.11.2014, 16:02

Ich glaub ich hab dich nicht richtig verstanden. Ich hatte gedacht es geht dir nur um die Ziffern.

0
OnePieceler 
Fragesteller
 05.11.2014, 13:11

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.

0
tryanswer  05.11.2014, 13:14
@OnePieceler

Ja, und dazu mußt du die Zahlen aus dem Dezimalsystem in das Dualsystem umrechnen - genau das wird dort auch erklärt.

0

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.

Iterationsrechner Binär-Bit-Rechnung - (programmieren, Informatik, CPP)

zahl & 1 liefert dir das letzte Bit
zahl & 2 das vorletzte
zahl & 4 das drittletzte
...

Woher ich das weiß:Berufserfahrung – Programmierer
OnePieceler 
Fragesteller
 05.11.2014, 13:15

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???

0
Suboptimierer  05.11.2014, 13:20
@OnePieceler

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.

0