プロが教えるわが家の防犯対策術!

学校で出た以下の問題の穴埋めが分かりません。先生曰く今回の課題はかなり難しいとの事だったのですが、、、案の定難しくてさっぱりでした。
みなさまどうか力をお貸しください。

unsigned short int型(16bit整数)の変数を引数として受け取り, 2進数を印字する関数
void print_short2binary(unsigned short);
を作成せよ.様々な値をテストするテスト用main()も作れ. テスト用を行うときの文字定義(コンパイルスイッチ)は"TEST"とせよ

【ヒント:以下のプログラムの足らない部分を埋めなさい】
#include <stdio.h>

void print_short2binary(unsigned short si)
{
for(int i=....
printf("%d", ....);

if(!(i%4)) // 見やすくするために4桁毎にスペースを入れる
printf(" ");
}
printf("\n");
}

#if defined(TEST)
int main(void)
{
print_short2binary(0x1234);
print_short2binary(0x1248);
print_short2binary(0x8421);
print_short2binary(0xAAAA);
print_short2binary(0x5555);
}
#endif

A 回答 (8件)

とりあえず、「 ... 」部分を補えという問題なんですよね。


 1つ目の... は 16;i--;){
 2つ目の... は  0 != (si & (1 <<i)) );
でOKかと。
    • good
    • 0

皆さん質問内容につられているようですが、print_short2binary()の入力は「16進数(で表記された文字列)」ではなくて「(ソースが16進数で表記された)16bit整数」ですよ。



私が作るなら、先にマスクを定数で作っておいて、ANDを取るかな…
あとはforで回すなら、その定数を配列に入れておく位で。
元のソースだとスペースが1個変な位置に入るのを気にしなければ、ほとんど考える所はないはず。

No2さん、No.6さんの言う通り、自分で考えて答えを出す事が重要かと思います。
    • good
    • 0

No2さんの余談、同意見です。


自分で考えて答えを出さないと根本的な「解決」にはならないと私も思います。

出題者の想定した回答とは違うと思いますが、こんな回答もありということで
別解、考えてみました。

>以下のプログラムの足らない部分を埋めなさい
とあるので、足らないところは、どこに何行でも挿入してもいいのですよね。

16桁分の文字列の領域を確保し、
偶数なら0、奇数なら1をそこに書き出すという関数を定義して、
その関数を使って、
下の桁から16回繰り返し文字列を埋めて、
逆順にして出力する

というのではいかが?

<おまけ>
この方法では、2進数でなくても、3進数でも4進数でも同じ方法で変換できますので、
先生によっては、ボーナス点がもらえるかもしれません。
    • good
    • 0

本当に「処理系依存」をなくしたいなら, sizeof やキャストを使わない方がいいと思うんだ>#4. この例についていえば, そう

すれば完全に処理系非依存にできるよ.
    • good
    • 0

入力値が 16bit と定められているので



#include <stdio.h>

void print_short2binary(unsigned short si)
{
for(int i=1; i<=8*sizeof(si); i++)
printf("%d", (si & (~((~((unsigned short)0))>>1)))?1,0);
si<<=1;
if(!(i%4)) // 見やすくするために4桁毎にスペースを入れる
printf(" ");
}
printf("\n");
}

/*
※ 解説
要は、最上位ビットから順番に判定していきます。
処理系依存を極力無くすため、最上位ビットのマスク定数は
(~((~((unsigned short)0))>>1))
とします。符号なし全ビットを一旦 true にしておいて右シフトすると最上位ビットだけが false になるので、それを全ビット反転すると最上位ビットだけが残ります。
厳密には char のビット数が 8 でない処理系では使えませんが、現在は殆どそのようなシステムは使われていないと思われるので目を瞑ってください。

*/
    • good
    • 0

一番単純な方法は、0~Fまでのビットパターンを全部用意しておいて、それを桁数ぶんだけ繰り返す方法です。

でもこのやり方はわかりやすいし高速かも知れませんけど、きっと先生の評価は低いでしょうね。

概念だけ:
switch(hoge){
case 0xf:
"1111"
case 0xe
"1110"

後はまじめにビットパターン比較で、0b0000~0b1111までをループで回すこと。
    • good
    • 1

自分ならビットシフト系のコマンドと排他的論理和(XOR)を駆使するかなあ。



…このように手順をまずは大雑把に考え、設問がどんなやり方なのかを「読み取る」事ができればあとは楽。
設問が実行しようとしている手順を再現すれば良いだけです。

・・・
ごめんね。
自分で考えて答えを出さないと根本的な「解決」にはならないと思うんだ。
ヒントをもらって色々と考えても分からないときは、具体的に何が分からないのかを添えて質問すると理解を深めることができます。
「分かったつもり」になって「疑問の先送り」をしないようにしましょう。


・・・余談・・・
このような回答(アドバイス)を送ると、約半数の人が自分をブロックするんだよねえ。
少なくともそれなりの知識があり興味を持って回答する人を排除することで
ブロックした当人が回答を得る機会を失うだけだから自分は気にしませんけど。
    • good
    • 3

この操作を, 自分の手でできますか?

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A