Dezimal zu Binaer umrechnen mithilfe von Bitmanipulation

 

Hier eine einfache Methode um Zahlen von Dezimal zu Binär umzurechnen.

Wir nehmen die Zahl und schieben die einzelne Bits einmal von Links nach Rechts. Bei jeder Verschiebung der Bits teilen wir das Ergebnis durch Zwei, ist die Zahl ohne Rest durch Zwei teilbar speichern wir eine 0 sonst eine 1.

Zum vereinfachen nehmen wir uns ein Beispiel an: a = 11 = 1011B ( B steht für Binär)

  • Beim ersten Durchlauf a%2 = 1, also nicht ohne Rest teilbar, dann speichern wir eine str +='1' ( string str). (wenn eine Zahl mit 1 in Binär endet heißt das dass diese Zahl ungerade ist und wenn sie eine 0 am Ende hat ist sie Gerade )
  • Wir verschieben jetzt die Bits nach Rechts: a>>1; und somit ist a= 0101B.
  • Beim zweiten Durchlauf a%2 = 1 also noch eine eins speichern. str +='1'.
  • Wir verschieben jetzt die Bits nach Rechts: a>>1; und somit ist a= 0010B.
  • Beim dritten Durchlauf a%2 = 0 also ohne Rest teilbar durch Zwei, das heißt eine 0 speichern. str +='0'.
  • Wir machen so weiter bis wir alle Bits verschoben haben. Als Ergebnis kriegen wir str="1101"; man merkt die Reihenfolge muss noch umgekehrt. Wir schreiben eine Revers() Funktion die den String umkehrt.
/**********************************************************
*  DEZIMAL ZU BINAER UMRECHNEN MITHILFE VON BITMANIPULATION
***********************************************************/
#include <iostream>
#include <string>
using namespace std;
string DecToBin(int num);
void revers(string &str);
int main()
{
  string bin;
  int zahl;
  cout<<"Programm zum umrechnen von Dezimal zu Binaer"<<endl;
  cout<<"Dezimalzahl eingeben ?  "<<endl;
  cin>>zahl;
  bin = DecToBin(zahl);
  std::cout<<bin<<endl;;
  return 0;
}
string DecToBin(int num)
{
  int n = sizeof(num)*8;
  string bin;
  for(int i=0; i<n; i++)
  {
    if(num%2==0)
      bin +='0';
    else bin +='1';
    num = num>>1;
  }
  revers(bin);
  return bin;
}
void revers(string &str)
{
  string rev = str;
  str="";
  for(int i=rev.size();i>=0; i--)
    str +=rev[i];
}

"ist die Zahl durch

"ist die Zahl durch Zwei teilbar" Diese Beschreibung ist nicht wirklich richtig, denn jede Zahl ist durch eine andere Zahl teilbar. Es würde besser passen, wenn "die Zahl ohne Rest durch Zwei teilbar" wäre, wie das der Modulo-Operator hier im Bsp. auch macht. MfG Alex H.

Danke für den Hinwei

 

Submitted by ghannami on Mi, 02/10/2010 - 19:19.

Danke für den Hinweis, so war das ja auch gemeint nur nicht genau ausgedrückt.Fehler korrigiert.

Alternative Lösung

Hier eine weitere Lösungsmöglichkeit:
 
string byte2bits(char byte)
{
string bits;
int pos = 1;
for (int j=0; j<8; j++)
{
if(byte & pos) bits = "1" + bits; else bits = "0" + bits; pos = pos << 1;
}
return bits;
}
Die Funktion wandelt 1 Byte in die entsprechende Dualzahl um und gibt diese als String zurück. Viele Grüße Thomas Siepmann