ここから本文です

解決済みのQ&A

10進数を2進数に変換するプログラムを教えて下さい。 関数はmain()でできるたけ...

s0cc3n_ra9i0さん

10進数を2進数に変換するプログラムを教えて下さい。
関数はmain()でできるたけ簡単なやつでお願いします。

補足
もう少し簡単にお願いしますm(__)m恐縮ですが
  • 質問日時:
    2009/5/29 11:58:17
    ケータイからの投稿
  • 解決日時:
    2009/6/13 03:04:13
  • 閲覧数:
    4,731
    回答数:
    3

ベストアンサーに選ばれた回答

veni_coさん

こんにちは♪

【方法1】
いちばん初歩的なのいきます★
2進数は、Cプログラミングでは 0 と 1 だけの文字列でしか表現できません。
なので、必要なものは
10進数を代入する整数型の変数 と
2進数表記を代入する文字列の配列
を用意します。

int Num;
char Str[17];

配列の要素数は、表現したい2進数の桁数+1
この(+1)は、文字列の最後にヌル文字 ’\0’ を代入するためです。
ここでは16桁(16bit)まで表すために、17要素の配列にしました。

まず、変数 Num に10進数を取得します。
これは、キーボードから入力させるならば、

printf("10進数を入力してください。:");
scanf("%d",&Num);

ですね(^^
次にこのNumを2進数の文字列表記に直します。
10進数を2進数に直すには、
「2で割り続けたときの余りを
”下位の桁”から順に並べる」と、2進数になります。

たとえば、10進数の「11」を2進数にする場合
11÷ 2 = 5 余り 1
5 ÷ 2 = 2 余り 1
2 ÷ 2 = 1 余り 0
1 ÷ 2 = 0 余り 1
なので、この余りを下から並べて 1011 となります。

ただし、プログラムでこれをやる場合、
求めた余りをそのまま文字列に代入すると、
文字として表示する際に、
数字ではなくアスキーコードとして扱われてしまいます。

たとえば、余りが 0 のとき、これを文字として代入すると、
「アスキーコード(番号) 0 が表す文字」が代入されてしまいます。
なので、文字「0」を表すアスキーコードに変換して
文字列配列に入れていかなくてはいけません。

アスキーコード表では、
「0」~「9」を表す番号は、その順番通りに並んでいます。
なので、
「0」 を表すアスキーコードは 0 + '0'; ( '0' は「0」を表すコード )
「1」 を表すアスキーコードは 1 + '0';
となります。

整理すると、
∞+;+∞+;+∞+;+∞+;+∞+;+∞+;+∞+;+∞
10進数を2で割り続け、
その余りを、アスキーコードで返還して、
文字列配列に逆順で入れていく。
文字列の最後の文字は"\n"を代入
∞+;+∞+;+∞+;+∞+;+∞+;+∞+;+∞+;+∞

このプログラムは

∞+;+∞+;+∞+;+∞+;+∞+;+∞+;+∞+;+∞
#include <stdio.h>

int main(){

int Num, i;
char Str[17];

printf("10進数を入力してください。:");
scanf("%d",&Num);

for(i=0;i<17;i++){
Str[ 16-i ] = ( Num % 2 ) + '0';
Num /= 2;
}
Str[ i ] = '\0';
printf("2進数表記は %s です。\n",Str);

return 0;
}
∞+;+∞+;+∞+;+∞+;+∞+;+∞+;+∞+;+∞


【方法2】
#include <stdlib.h>
を使えば、itoa() 関数があります
(推奨されない関数らしいですが^^;)

char* itoa(int Num, char* Str, int N);

この関数は、
数値 Num を N 進数 の表記で Str に代入
してくれる関数です。
これを使えば、

∞+;+∞+;+∞+;+∞+;+∞+;+∞+;+∞+;+∞
#include <stdio.h>
#include <stdlib.h>

int main(){

int Num;
char Str[17];

printf("10進数を入力してください。:");
scanf("%d",&Num);

itoa(Num,Str,2);
printf("2進数表記は %s です。\n",Str);

return 0;
}
∞+;+∞+;+∞+;+∞+;+∞+;+∞+;+∞+;+∞

で終わりです♪

この質問は投票によってベストアンサーが選ばれました!

ベストアンサー以外の回答

(2件中1〜2件)

並べ替え:回答日時の
新しい順
古い順

 

pyon_naniwa2001さん

#include <stdio.h>
#include <limits.h>

void dec_bin(char s[], int n)
{
int i = CHAR_BIT * sizeof(int), j = 0;

if(n < 0){
s[j ++] = '-';
n *= -1;
}
while(-- i){
if((n >> i) & 1) break;
}
while(i >= 0){
s[j ++] = '0' + ((n >> i) & 1);
-- i;
}
s[j] = '\0';
}

int main(void)
{
char s[CHAR_BIT * sizeof(int) + 2];
int i;

for(i = -10; i <= 10; ++ i){
dec_bin(s, i);
printf("%12d == %33s\n", i, s);
}
dec_bin(s, INT_MAX);
printf("%12d == %33s\n", INT_MAX, s);
dec_bin(s, INT_MIN);
printf("%12d == %33s\n", INT_MIN, s);
return 0;
}

  • 違反報告
  • 編集日時:2009/5/30 01:34:25
  • 回答日時:2009/5/29 15:24:31

k032yfさん

int main(int argc,char **argv)
{
unsigned int i,k,x;
char str[50];
scanf("%d",&k);
for(i = 0;i < 32;++i)
{
x = k & 0x01;
str[31 - i] = x + '0';
k /= 2;
}
str[32] = '\0';
printf("%s \n",str);
return 0;
}

Q&Aをキーワードで検索:

PR

総合Q&Aランキング

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。

知恵コレに追加する

閉じる

知恵コレクションをするID/ニックネームを選択し、「追加する」ボタンを押してください。
※知恵コレクションに追加された質問や知恵ノートは選択されたID/ニックネームのMy知恵袋で確認できます。

ほかのID/ニックネームで利用登録する