キーボードからの値を2進数変換

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
もこ

キーボードからの値を2進数変換

#1

投稿記事 by もこ » 9年前

練習問題なのですが仕様は下記になります。
キーボードから、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;
}

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: キーボードからの値を2進数変換

#2

投稿記事 by みけCAT » 9年前

もこ さんが書きました:手順(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進数変換

#3

投稿記事 by かずま » 9年前

これは、問題が間違っています。
(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;
}

閉鎖

“C言語何でも質問掲示板” へ戻る