- 締切済み
C言語プログラミング。
標準出力から整数を読み込んで、その整数が奇数か偶数かを判定して、判定結果を出力するプログラムをif文を用いて作りたいんです。剰余演算子を使ってなら作れるんですけど、剰余演算子を使わないで作るにはどうすればいいのでしょうか。 よろしくおねがいします。
- みんなの回答 (10)
- 専門家の回答
みんなの回答
- moritan2
- ベストアンサー率25% (168/670)
なるほど、言われてみればDSPなど特殊用途のプロセッサなら、主に行う処理内容によってどのような数値表現が最適か違ってくるでしょうから、いろいろな数値表現があるかもしれませんね。 3D専用のプロセッサならintが無いことも考えられますから、Cコンパイラを実装するならintの数値表現はコンパイラの作成者まかせですね。 Cのインタープリタというのも、昔販売されていましたね。学習用とか趣味でつくる人も当然いるでしょう。 でも、私の個人的な感想ですが、質問者さんが環境を書かれていないのならなおさら、そういう特殊な状況というのは考える必要はないように私は思いました。
- jacta
- ベストアンサー率26% (845/3158)
#8の補足要求は、質問者さんに対してではなく、私に対してのような気がするので、念のため補足します。違っていたらすみません。 > Cはネイティブコードで動くコンパイラですから、処理系依存ではなくCPU依存ということだと思います。 規格上はネイティブコードかどうかなど、一切問われていません。実際、インタプリタも実在します。 なお、プロセッサによっては、負の値の内部表現を拘束しないものもあります。乗除算器がなく、オーバーフローフラグのようなものがなければ、負の内部表現をどうするかは、ソフト側で決めなければなりません。 > 1の補数表現を使うCPUなんてこの現代に存在しますか? 存在するかどうかでいえば存在しますが、非常に稀なことは確かです。ただ、どんなに稀であっても、実際にそれを扱わなければならない状況になれば、その当事者にとってはそれが自分が相手にしなければならない処理系であり、世間のトレンドや統計上のことを言ってみても無意味です。 質問者さんがどんな処理系を相手にしているかは、質問者さん自身が補足してくださらない以上、我々にはわかりません。メインフレームなのか、マイクロコントローラなのか、DSPなのか、インタプリタなのか、自作プロセッサなのか、わかるはずがないですから。 ところで、研究目的などで、自作の仮想マシンやFPGAなどで自作したプロセッサであれば、1の補数表現だろうが、符号ビット+絶対値だろうが、好きにできます。工業用途ではなく、研究用途では、およそあらゆる可能性を考慮しなければなりません。 また、標準規格の学習目的等の理由で、規格厳密合致プログラムを書く訓練をしている可能性も当然考慮すべきです。 だからこそ、処理系や用途を特定してよいのであれば、それを質問時に明確にする必要があるのです。
- moritan2
- ベストアンサー率25% (168/670)
Cはネイティブコードで動くコンパイラですから、処理系依存ではなくCPU依存ということだと思います。しかし、1の補数表現を使うCPUなんてこの現代に存在しますか?
- jacta
- ベストアンサー率26% (845/3158)
参考までに、論理積を使うとなぜ処理系に依存するかを補足しておきます。 符号付き整数型に対して&演算子を使うと、結果の値は整数の内部表現に依存します。正の値の場合は問題ないのですが、負の値の場合、その内部表現がどうなるかは処理系に依存しますので、結果として、符号付き整数に対する&演算子の振る舞いは処理系に依存してしまいます。 具体的には、負の値の内部表現に1の補数を使う処理系の場合、-1を16ビットで表すと0xfffeになります。-1は2で割り切れないので奇数ですが、最下位ビットは0です。それに対して、2の補数の場合、-1の内部表現は0xffffですから、最下位ビットは1になります。 質問者さんが処理系を特定されていない以上、一般論としては&演算子は使うべきではありません。
- moritan2
- ベストアンサー率25% (168/670)
偶数は、2進数で表現すれば1の位が0です。 ですから、1とビットANDを調べ、0なら偶数、1なら奇数です。 読み込まれた数を a とすれば if((a & 1) == 0) { printf("偶数\n"); } else { printf("奇数\n"); }
- jacta
- ベストアンサー率26% (845/3158)
> 剰余演算子を使ってなら作れるんですけど では、それを貼りましょう。 入力が負の値の場合、どのようにしているかに興味があります。 ちなみに、2で割り切れるかどうかを判定するだけであれば、div関数を使うのが簡単です。論理積を使うと処理系に依存してしまいます(剰余演算子を使った場合も処理系に依存します)ので、div関数を使えば確実です。 int value; /* value に値を入力 */ if (div(value, 2).rem == 0) /* 偶数 */ else /* 奇数 */
- usatan2
- ベストアンサー率37% (163/436)
奇数なら1、偶数なら0を返す関数f(x)をつくってそれを呼び出したらどうですか? f(x)自身は、0と1のとき以外は知らんといって他力本願で解決してしまう if (x==0) ans=0; else if(x==1) ans=1; else if(x<0) ans = f(x+2); else if(x>=2) ans = f(x-2); といった具合でどうでしょう?
- edomin
- ベストアンサー率32% (327/1003)
別な方法で。 入力された整数を2で割って、整数化してから2倍します。 2倍した数字と元の数字が同じなら「偶数」です。 例) if(input_val == int(input_val/2)*2) // 偶数の処理 else // 奇数の処理 こんな、感じ?
- ggaogg
- ベストアンサー率43% (38/88)
#1です。 なんか中途半端にソース載っちゃいました。 一応全部のせます。 #include <stdio.h> int main() { int a = 10; int b = 15; if( a & 1 ) puts("奇数"); else puts("偶数"); if( b & 1 ) puts("奇数"); else puts("偶数"); return 0; }
- ggaogg
- ベストアンサー率43% (38/88)
その数字が偶数か奇数かを調べたいのであれば int a = 10; int b = 15; if( readNum / 2 ) とするのではなくて if( readNum & 1 ) とすれば偶数か奇数かはわかります。 一応乗除演算子ではありません・・論理演算しです。