ページ 1 / 1
キーボードからの値を2進数変換
Posted: 2015年12月21日(月) 22:18
by もこ
練習問題なのですが仕様は下記になります。
キーボードから、0から255までの整数を入力させ、その数値を二進数に変換するプログラムを作る。手順は以下の通り行う。
(1)入力された数値を、変数nに代入する。
(2)nと0x80の論理積を求める。
(2)(2)の計算の結果が0ならば、0を、それ以外なら、1を表示する。
(3)nの値を、左シフトする。
(4)nが0でなければ、(2)に戻る。
(5)nが0ならば、改行し、終了。
期待される実行結果
Input Number(0-255):35 ←キーボードから入力
00100011
手順(5)のnが0ならば改行して終了というのがよく理解できませんでした。
ですので、ループを8回で止めて出力しています。多分breakで抜けると思うのですが、
お手伝お願いします。
コード:
#include<stdio.h>
int main(void){
int n,num=0,j;
int result=0;
unsigned char i=0x80;
printf("Input Number:");
scanf("%d",&n);
result=n&i;
for(j=0;j<8;j++){
if(n<<j != 0){
result=n<<j & i;
if(result==0){
num=0;
}
else{
num=1;
}
}
printf("%x",num);
}
return 0;
}
Re: キーボードからの値を2進数変換
Posted: 2015年12月21日(月) 22:59
by みけCAT
もこ さんが書きました:手順(5)のnが0ならば改行して終了というのがよく理解できませんでした。
そのままの意味でしょう。
ただし、int型の数(符号付き整数)を0になるまで左シフトしようとすると、その前にオーバーフローしてundefined behaviorになってしまいます。
期待される実行結果を得るためには、nを8ビットであることが保証された符号なし整数のuint8_t型にするといいでしょう。
コード:
#include<stdio.h>
#include<stdint.h>
int main(void){
int input=0,num=0;
int result=0;
uint8_t n,i=0x80;
printf("Input Number(0-255):");
scanf("%d",&input);
n=input; /* (1) */
do{
result=n & i; /* (2) */
if(result==0){
num=0;
}
else{
num=1;
}
printf("%d",num);
n<<=1; /* (3) */
} while(n); /* (4) nが0でなければ、(2)に戻る */
putchar('\n'); /* (5) nが0ならば、改行し、終了 */
return 0;
}
オフトピック
この手順だと、たとえば36を入力した時うまく(一般的に知られている)二進数に変換できないですが、仕様ならしかたないですね。
Re: キーボードからの値を2進数変換
Posted: 2015年12月22日(火) 20:27
by かずま
これは、問題が間違っています。
(2) が 2つあるのもおかしいし、
この手順に従うと偶数が正しい 2進数になりません。
問題を勝手に手直しすると、
コード:
(1) 入力された数値を、変数 n に代入する。
(2) 0x80 を 変数 m に代入する。
(3) n と m の論理積が 0 ならば、0 を、それ以外なら、1 を表示する。
(4) m の値を、右シフトする。
(5) m が 0 でなければ、(3)に戻る。
(6) m が 0 ならば、改行し、終了。
次のプログラムは、 for文を使ったので上記の手順とはちょっと順序が変わった
ところがありますが、まあいいでしょう。
コード:
#include <stdio.h>
int main(void)
{
int n, m;
printf("Input Number:");
scanf("%d", &n); // (1)
for (m = 0x80; m != 0; m >>= 1) // (2), (5), (4)
putchar((n & m) == 0 ? '0' : '1'); // (3)
putchar('\n'); // (6)
return 0;
}