• ベストアンサー

C言語の&に関する質問

C言語で if (x == 0.0) (いろいろな計算) return x < 0.0 && (n & 1) ? -ans : ans; というプログラムがあるのですが、 最後のreturnのところで x がゼロ以下で且つ、n &1の場合には -ansを返し、そうでない場合にはansを返すとあるのですが、 n&1というのはどういう意味なのでしょうか? C言語で&と言えば、 http://www9.plala.or.jp/sgwr-t/c/sec14.html のページにあるように、ビットごとの AND演算子ですが、 この場合にはどういう意味で使われているのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • kokorone
  • ベストアンサー率38% (417/1093)
回答No.1

質問者様が提示されているサイトに答えがあると思うのですが。 nがint(整数)という前提で、 nに設定されたデータの最終BITのみをマスクする処理 言い換えれば、奇数か偶数か判定する 以上です。

MADADA
質問者

お礼

ありがとうございます。 つまり、 nが奇数のときには1を返し、 偶数のときには0を返すという意味なのですよね? でも、 return x < 0.0 && (n & 1) ? という分岐の中に入れて、奇数の場合にはどちら?偶数の場合にはどちらへ分岐するのでしょうか?

MADADA
質問者

補足

すいません、理解できました。

その他の回答 (2)

  • maiko0318
  • ベストアンサー率21% (1483/6970)
回答No.3

#include<stdio.h> int main(void) { int x, n, ans; x = 1; n = 1 ; ans = 5; printf("x=%d n=%d ans=%d fnc=%d\n", x, n, ans, fnc(x, n, ans)); x = 1; n = 0 ; ans = 5; printf("x=%d n=%d ans=%d fnc=%d\n", x, n, ans, fnc(x, n, ans)); x = -1; n = 1 ; ans = 5; printf("x=%d n=%d ans=%d fnc=%d\n", x, n, ans, fnc(x, n, ans)); x = -1; n = 0 ; ans = 5; printf("x=%d n=%d ans=%d fnc=%d\n", x, n, ans, fnc(x, n, ans)); } int fnc(x, n, ans){ return x < 0.0 && (n & 1) ? -ans : ans; } x=1 n=1 ans=5 fnc=5 x=1 n=0 ans=5 fnc=5 x=-1 n=1 ans=5 fnc=-5 x=-1 n=0 ans=5 fnc=5 という結果になりました。

  • kokorone
  • ベストアンサー率38% (417/1093)
回答No.2

判定の基本は条件が成り立つ場合 TRUE(1)となります。 今回のケースでは(n&1)の結果を判定しますから、 xがマイナスかつ奇数ならば、-ans それ以外ならばans となるでしょう。 質問文で、0以下というのは、間違いで、0未満つまりマイナスです。

関連するQ&A

  • C言語のscanf文について

    C++言語の勉強中で、ビット演算子のところで質問です。 動作は、キーボードから16進データを入力して、そのデータの3,4ビット目を0にした時のデータを算出するというものです。 ここでProgram中の scanf 文にてエラーが出てしまいます。 ①%X(16進数)の型がintに対して、ope変数がcharとなっている。  ⇒ここの整合を取るためにはどういう方法がありますでしょうか? 以下がProgramです。 /*************************************************************/ /* プログラム:ビット演算子 */ /* 動作内容 :ビット演算子によりビット操作する */ /* 入力データの3,4ビット目を0にした値を算出する */ /**************************************************************/ #include<stdio.h> int main(void) { unsigned char ope; unsigned char ans; printf(" Hex-Data : "); scanf("%X", &ope); printf(" ope : 0x%02X\n", ope); ans = ope & 0xe7; /* 3,4ビット目:0 */ printf(" ope & 0xe7 = 0x%02x\n", ans); getchar(); getchar(); return(0); }

  • 私はC言語を習い始めて5日の初心者です。

    私はC言語を習い始めて5日の初心者です。 下記のプログラムが動かないので優しく教えてください。 どうかお願いします。 #include <stdio.h> int main() { int ans1,ans; int total printf("コンビニ行くときは(1:車で 2:自転車で 3:歩いて)行く\n"); scanf("%d",&ans1); printf("1:汗かいた記憶がない 2:たまに汗かく 3:よく汗をかく\n"); scanf("%d",&ans2); total=ans1+ans2; if (total<4) { printf("運動不足です\n"); }else { printf("良く運動していますね\n"); } return(0); }

  • C言語で分からないところがあるのですが……

    C言語で分からないところがあるのですが…… すみません。C言語の課題で分からないところがあり、質問しに来ました。 ユーザから数を受けて、そこまでのフィボナッチ数列を表示させるというプログラムです。 下のソースコード(でいいんですよね?)は正しいやつです。 for文を使って、繰り返しの作業を行うことに成功しましたが、doとwhileに書き換える作業がうまくできません。 どなたか助けてください。 #include<stdio.h> fib(int n) { if(n == 1)return(1); else{ if(n == 2) return (1); else return fib(n-1) + fib(n-2); } } main() { int n, i ; printf("INPUT the number. : "); scanf("%d",&n); for(i=1; i<=n; i++){ printf("F%d = %d\n",i, fib(i)); } }

  • C言語で分からない点があるのですが……

    C言語で分からない点があるのですが…… こんにちは。C言語を学んでいて、詰まったので宜しければ回答いただけると嬉しいです。 フィボナッチ数列に関するプログラミングです。 ユーザから数字を受け取ります。(第何項か) そこまでの数字を表示するというプログラムです。 n=3なら F1=1 F2=1 F3=2 という具合です。 しかし、実行した結果が添付した図の通りで、途中の項がすっ飛ばされていました。 どうすればいいんでしたっけ? 宜しければご助力ください!! #include<stdio.h> fib(int n) { if(n == 1)return(1); else{ if(n == 2) return (1); else return fib(n-1) + fib(n-2); } } main() { int n, i ; printf("INPUT number.: "); scanf("%d",&n); for(i=2; i<=n; i++){ printf("F%d = %d\n",n, fib(n)); } }

  • c言語のand or演算子について教えてください。

    c言語のand or演算子について教えてください。 if( A && B || c) と書いた場合、どういう風に読み取ればいいのでしょうか?

  • C言語

    #include <stdio.h> int main(void) { int a=0,ans1,ans2,ans3,ans4; printf("整数を入力してください。\n"); scanf("%d",a); ans1 = a+7; ans2 = a*;8 ans3 = a%3; ans4 = a*(-1); printf("%d\n",ans1); printf("%d\n",ans2); printf("%d\n",ans3); if(a==15){ prntf("true\n",a); } else{ printf("false\n",a); } if(a != 8){ printf("true\n",a); } else{ printf("false\n",a); } if(a <= 3){ printf("true\n",a); } else{ printf("false\n",a); } printf("%d\n",ans4); if(a<2||7<a){ printf("true\n",a); } else{ printf("false\n",a); } return 0; } これを実行しようとしてもexeファイルになりません。 教えていただけませんか?

  • C言語の構造体

    組込み系でマイコンにソフトをプログラミングの仕事をしています。 C言語は初心者です。 http://www9.plala.or.jp/sgwr-t/c/sec15.html のページの冒頭に、 「構造体は幾つかの異なる型のデータをまとめて 1つのデータ型として扱うものなのです。」と書かれています。 1つのデータ型として扱うとどのようなメリットがあるのでしょうか? 例えば、 struct seiseki seito1; のように対象が1つ(seito1)なら int seito1_no; char  seito1_name[20]; double seito1_average; と変数を確保すれば済むのに、 何故、構造体で宣言するのでしょうか? 例えば、 struct seiseki seito2[20]; のように、似たものが複数ある場合は(seito2が20人分なるなら、) 構造体で宣言する意味があるとはなんとなくわかります。 後ページの http://www9.plala.or.jp/sgwr-t/c/sec15-4.html では、関数でのやり取りが書かれています。 関数で引数や返値で扱うときに構造体にしておいた方が良いからでしょうか? 構造体のメリットというのが今一わかりません。 対象が1つでも構造体で書いた方がいろんな意味で良いのでしょうか? 如何せん、初心者なので質問がうまく書けませんがご了承ください。 ※上から目線的な回答はご遠慮願います。

  • C言語で電卓を作成する。

    C言語を用いて三項まで計算できる電卓を作りたいのですが、どうも上手くいきません。 四則演算(+、-、×、÷)の優先順位を用いたプログラミング方法が分かりません。 以下に自分で作成したソースを添付します。 このソースに修正や追加して3項までの四則演算できるプログラミングを教えていただけますか? 宜しくお願いします。 #include <stdio.h> int main(void) { int answer; /*答え*/ int x,y,z; /*x=第一項,y=第二項,第三項*/ char op1,op2; /*演算子1、演算子2*/ while(1){ printf("式を入力してください\n"); printf("式:"); scanf("%d %c %d %c %d" ,&x,&op1,&y,&op2,&z); if((op1=='+'|'-'|'*'|'/') && (op2=='+'|'-'|'*'|'/')){ switch(op2){ case '+': answer=y+z; break; case '-': answer=y-z; break; case '*': answer=y*z; break; case '/': if(z==0){ printf("ERROR\n"); return 0; } answer=y/z; break; default: printf("ERROR\n"); return 0; } switch(op1){ case '+': answer=x+answer; break; case '-': answer=x-answer; break; case '*': answer=x*answer; break; case '/': if(y==0){ printf("ERROR\n"); return 0; } answer=x/answer; break; default: printf("ERROR\n"); return 0; } printf("答え:%d\n",answer); } else { switch(op1){ case '+': answer=x+y; break; case '-': answer=x-y; break; case '*': answer=x*y; break; case '/': if(y==0){ printf("ERROR\n"); return 0; } answer=x/y; break; default: printf("ERROR\n"); return 0; } printf("答え:%d\n",answer); } } } 左辺に×、÷が来ても優先的に計算されません。

  • C言語の簡単なプログラム

    簡単な足し算のみの電卓をC言語で作っています。 /が入力されるまで足し算を繰り返すものです。 コンパイルをして、足し算を繰り返すところまでは上手くいったのですが、 /を入力してのループの抜け方がわかりません。 #include<stdio.h> int main(void) { int x=0,z; printf("数値を入力\n"); printf("終了は/を入力\n"); printf("\n結果 %d\n",x); while(1){ scanf("%d",&z); x=x+z; /* 足し算の計算 */ printf("結果 %d\n",x); /* 現在の計算結果を表示 */ } printf("終了 結果: %d\n",x); /* 計算の終了、合計値の表示 */ return 0; } while文のなかにifでいれればいいのでしょうか? その場合、 if(z=='/') break; でいいんでしょうか? if文以外のやり方がある場合も教えていただけたらと思います。 よろしくお願いします。

  • ビット演算を学びたい

    a &= 2; a |= 2; a ^= 2; a ~= 2; a <<=2; a >>=2; みたいな感じでビット演算が使われているソースを 良く見るのですが、いまいちビット演算で何をしているのかが 分かりません。 参考書などには文字通りビットをいじるような旨のことが書いてあります。 (こちらにも同じようなことが http://www9.plala.or.jp/sgwr-t/c/sec14.html) こういうので何となくは分かるのですが、 実際にこれを何に使えるか、実践ではどのように使うのかが なかなか見えてきません。 このビット演算を私のような者でも実際のプログラムで使いこなせるように なれるようなサイトや書籍の提示、あるいはサンプルのプログラムなどで ご指導いただけたらと思います。

専門家に質問してみよう