ここから本文です

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

s0c********さん

2009/5/2911:58:17

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

補足もう少し簡単にお願いしますm(__)m恐縮ですが

閲覧数:
11,619
回答数:
3

違反報告

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

ven********さん

2009/5/2915:22:57

こんにちは♪

【方法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;
}
∞+;+∞+;+∞+;+∞+;+∞+;+∞+;+∞+;+∞

で終わりです♪

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

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

1〜2件/2件中

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

pyo********さん

編集あり2009/5/3001:34:25

#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;
}

k03********さん

2009/5/2912:18:55

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をキーワードで検索:

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

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる