10進数を2進数に変換するプログラムを簡単に書きました(30分かかりました)。もっと簡単な方法があると思いますので、教えていただけますか? これがそのコードです。
#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;
}
ところで、複雑ですが、私はベストを尽くしました。
編集 - 私が最終的に使用した解決策は以下の通りです:。
std::string toBinary(int n)
{
std::string r;
while(n!=0) {r=(n%2==0 ?"0":"1")+r; n/=2;}
return r;
}
[.to_string()メソッドは、先頭にゼロのパディングを施したバイナリのテキスト表現を持つ std::string
を返します。
例えば、32ビットの整数から32文字の文字列を得るには、std::bitset<32>
とします。
#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: 8進法と16進法に関する私の回答を編集しないでください。OPは特にDecimal To Binaryを求めています。
int`変数は10進数ではなく、2進数です。あなたが求めているのは、数字の2進数の文字列表現です。これは、個々のビットをフィルタリングするマスクを適用して、それを印刷することで得られます。
for( int i = sizeof(value)*CHAR_BIT-1; i>=0; --i)
cout << value & (1 << i) ? '1' : '0';
質問がアルゴリズムによるものであれば、これが解決策です。そうでない場合は、std::bitsetクラスを使ってこれを処理するべきです。
bitset< sizeof(value)*CHAR_BIT > bits( value );
cout << bits.to_string();