Jeg skrev et 'enkelt' (det tok meg 30 minutter) program som konverterer desimaltall til binært. Jeg er SIKKER på at det finnes en mye enklere måte, så kan du vise meg? Her er koden:
#include <iostream>
#include <stdlib.h>
using namespace std;
int a1, a2, remainder;
int tab = 0;
int maxtab = 0;
int table[0];
int main()
{
system("clear");
cout << "Enter a decimal number: ";
cin >> a1;
a2 = a1; //we need our number for later on so we save it in another variable
while (a1!=0) //dividing by two until we hit 0
{
remainder = a1%2; //getting a remainder - decimal number(1 or 0)
a1 = a1/2; //dividing our number by two
maxtab++; //+1 to max elements of the table
}
maxtab--; //-1 to max elements of the table (when dividing finishes it adds 1 additional elemnt that we don't want and it's equal to 0)
a1 = a2; //we must do calculations one more time so we're gatting back our original number
table[0] = table[maxtab]; //we set the number of elements in our table to maxtab (we don't get 10's of 0's)
while (a1!=0) //same calculations 2nd time but adding every 1 or 0 (remainder) to separate element in table
{
remainder = a1%2; //getting a remainder
a1 = a1/2; //dividing by 2
table[tab] = remainder; //adding 0 or 1 to an element
tab++; //tab (element count) increases by 1 so next remainder is saved in another element
}
tab--; //same as with maxtab--
cout << "Your binary number: ";
while (tab>=0) //until we get to the 0 (1st) element of the table
{
cout << table[tab] << " "; //write the value of an element (0 or 1)
tab--; //decreasing by 1 so we show 0's and 1's FROM THE BACK (correct way)
}
cout << endl;
return 0;
}
Det er forresten komplisert, men jeg gjorde mitt beste.
Redigering - Her er løsningen jeg endte opp med å bruke:
std::string toBinary(int n)
{
std::string r;
while(n!=0) {r=(n%2==0 ?"0":"1")+r; n/=2;}
return r;
}
std::bitset
har en .to_string()
-metode som returnerer en std::string
som inneholder en tekstrepresentasjon i binær form, med utfylling på null.
Velg bredden på bitsettet etter behov for dine data, f.eks. std::bitset<32>
for å få strenger på 32 tegn fra 32-biters heltall.
#include <iostream>
#include <bitset>
int main()
{
std::string binary = std::bitset<8>(128).to_string(); //to binary
std::cout<<binary<<"\n";
unsigned long decimal = std::bitset<8>(binary).to_ulong();
std::cout<<decimal<<"\n";
return 0;
}
EDIT: Vennligst ikke rediger svaret mitt for oktal og heksadesimal. OP ba spesifikt om desimal til binær.
En int
-variabel er ikke desimal, men binær. Det du er ute etter, er en binær strengrepresentasjon av tallet, som du kan få ved å bruke en maske som filtrerer enkeltbiter og deretter skrive dem ut:
for( int i = sizeof(value)*CHAR_BIT-1; i>=0; --i)
cout << value & (1 << i) ? '1' : '0';
Det er løsningen hvis spørsmålet ditt er algoritmisk. Hvis ikke, bør du bruke klassen std::bitset til å håndtere dette for deg:
bitset< sizeof(value)*CHAR_BIT > bits( value );
cout << bits.to_string();