練習問題なのですが仕様は下記になります。
キーボードから、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で抜けると思うのですが、
お手伝お願いします。
キーボードからの値を2進数変換
Re: キーボードからの値を2進数変換
そのままの意味でしょう。もこ さんが書きました:手順(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を入力した時うまく(一般的に知られている)二進数に変換できないですが、仕様ならしかたないですね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: キーボードからの値を2進数変換
これは、問題が間違っています。
(2) が 2つあるのもおかしいし、
この手順に従うと偶数が正しい 2進数になりません。
問題を勝手に手直しすると、
次のプログラムは、 for文を使ったので上記の手順とはちょっと順序が変わった
ところがありますが、まあいいでしょう。
(2) が 2つあるのもおかしいし、
この手順に従うと偶数が正しい 2進数になりません。
問題を勝手に手直しすると、
(1) 入力された数値を、変数 n に代入する。
(2) 0x80 を 変数 m に代入する。
(3) n と m の論理積が 0 ならば、0 を、それ以外なら、1 を表示する。
(4) m の値を、右シフトする。
(5) m が 0 でなければ、(3)に戻る。
(6) m が 0 ならば、改行し、終了。
ところがありますが、まあいいでしょう。