解決済みのQ&A
10進数を2進数に変換するプログラムを教えて下さい。 関数はmain()でできるたけ...
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;
}
∞+;+∞+;+∞+;+∞+;+∞+;+∞+;+∞+;+∞
で終わりです♪
- 違反報告
- 回答日時:2009/5/29 15:22:57
この質問は投票によってベストアンサーが選ばれました!
ベストアンサー以外の回答
(2件中1〜2件)
- 並べ替え:回答日時の
- 新しい順
- |
- 古い順
#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;
}
- 違反報告
- 回答日時:2009/5/29 12:18:55
関連度の高い質問
- printfの末尾のスペースが消える#include<stdio.h>int main(){ for(int i=1;i<=5;...
- 改良しましたですがprintf()がおかしいと出てしまいました...#include<stdio.h>#i...
- for文で繰り返しprintf →ずれてしまう...#include<stdio.h>int main(void){int n;...
- printf関数 では#include <stdio.h>が必要でした。main関数は#includeなしで使用...
- #include<stdio.h>int main(void){ int no; printf("金額を入力してください:"); ...
「printf、stdio.h」に関する質問
- #include <stdio.h>#include <stdlib.h>#include <math.h>doubleangle(double x1,...
- #include <stdio.h>int main (void){printf("C言語始めました\");return 0;}を実...
- #include(stdio.h)int main(void){ int i,j,ln; printf("何段ですか:"); scanf("%...
- C言語のプログラムについて。#include <stdio.h>#include <stdlib.h>FILE *fp;int...
- c言語 プログラム#include <stdio.h>#include <stdlib.h>#include <string.h>stat...