• ベストアンサー

C#でビット演算はできますか?

C#2008で、以下のソースを動かして、OK 2が表示されるのを期待していたのですが、演算子&をintとbool型の演算子に適用できません。 となります。 何か良い方法はありますか? int a = 32 | 16; int b = 8; int c = 16; if (a & b != 0){ MessageBox.Swho("OK 1"); } if (a & c != 0){ MessageBox.Swho("OK 2"); }

  • roox2
  • お礼率1% (1/79)

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

  • ベストアンサー
  • tabide
  • ベストアンサー率44% (148/331)
回答No.1

等値演算子 ==, != の方が、論理演算子 &, ^, | より優先順位が高いためです。つまり   a & b != 0 は   a & (b != 0) と解釈されます。 もうお分かりですね?   (a & b) != 0 と、カッコでくるんで下さい。

その他の回答 (1)

回答No.2

if ((a & b) != 0){ MessageBox.Show("OK 1"); } と解釈して欲しいところを if (a & (c != 0)){ MessageBox.Show("OK 2"); } と解釈されちゃってる。

関連するQ&A

  • C++のnew演算子について質問です。

    C++のnew演算子について質問です。 以下は関数にポインタを渡して値を得ようしたプログラムです。 ※ディレクティブは省略しています。 void test( int* a ) { a = new int( 100 ); } void main() { int* b; test(b); printf( "%d", *b ); delete b; b = NULL; } このプログラムを実行すると、コンソール画面には100と表示されるかと思っていたのですが、 実際には滅茶苦茶な値と、例外が発生して強制終了しました。 また、関数に渡したポインタのアドレスもNULLとなってしまいます。 そこで以下のようにソースを変更すると正常に100が表示されました。 void test( int** a ) { *a = new int( 100 ); } void main() { int* b; test(&b); printf( "%d", *b ); delete b; b = NULL; } 結果的には目的が達成できたのでいいのですが、なぜこのような動作をするのかが いまいち釈然としません。 new演算子は自動的には破棄されないのではないのでしょうか? 回答の程、よろしくお願いします。

  • C言語における複素数の四則演算について

    複素数の四則演算(a+biとc+diの四則演算)について、for文を用いて表示するプログラムについて、???の部分に何を入れたらよいかわからず、うまく実行することができません。和・差・積・商の計算種別を入れるみたいなのですが、何を入れたらいいのかわかりません。 #include <stdio.h> void fukuso(double a,double b,double c,double d,double *e,double *f,int keisan); int main(void) { double a=4, b=8, c=4, d=3, e, f; int i; for(i=1;i<5;i++){ fukuso(a,b,c,d,&e,&f,???); if(i==1) printf("和演算\n"); else if(i==2) printf("差演算\n"); else if(i==3) printf("積演算\n"); else printf("商演算\n"); printf("e=%f f=%f i\n",e,f); } return (0); } void fukuso(double a1,double b1,double a2,double b2,double *a3,double *b3,int keisan) { if(keisan==1){ *e=a+c; *f=a+c; } else if(keisan==2){ *e=a-c; *f=b-d; } else if(keisan==3){ *e=a*c-b*d; *f=a*d+c*b; } else{ *e=(a*c+b*d)/(c*c+d*d); *f=(-a*d+c*b)/(c*c+d*d); } }

  • ASP.NET でビット演算できない

    ASP.NET でビット演算できません。 どなたか助言をください。 開発環境:Visual Studio 2005(.NET Framework Ver:2.0.50727) 言語:C# 以下ソース ------------------------------- public static int ToIntCtrlStatus(byte bStatus) {  byte DXF_STT_MCTL = 0x01;  byte DXF_STT_SCTL = 0x02;  byte DXF_STT_CTL = 0x03;  byte DXF_STT_MDRV = 0x04;  byte DXF_STT_SDRV = 0x08;  byte DXF_STT_DRV = 0x0C;  int nRet = 0;  if (bStatus & DXF_STT_CTL)  {     if (bStatus & DXF_STT_DRV)     {        if (bStatus & DXF_STT_MCTL) nRet = 3;        else nRet = 5;     }     else if (bStatus & DXF_STT_MCTL) nRet = 4;     else nRet = 1;  }  else if (bStatus & DXF_STT_DRV) nRet = 2;  else nRet = 1;  return nRet; } ------------------------------- ※ビルドすると、ソース内の「if (bStatus & …)」のbStatusの下に波線が出て、「型'int'を型'bool'に暗黙的に変換できません。」というエラーになります。

  • 論理演算結果の表示について

    Cで論理演算をするプログラムを考えているのですが、少し行き詰ってしまいました。 例えば(A+B)*(A+B+C)を論理演算で考えた場合、答えはA+Bとなりますがどうすればこの結果を画面に表示させる事ができるのかが分からないのです。 ただ単に #include <stdio.h> int main(void) { int a,b,c,y ; a = 'A'; b = 'B'; c = 'C'; y = a|b & a|b|c; printf("%c\n",y); } としたら表示結果は「C」となってしまいますよね(文字を2進で計算しているからこの結果になるという事は理解しています)。 もしかしてif文を使用して総当り的に文字を調べていくしか方法がないのでしょうか?実際はもっと複雑な演算をプログラムに計算してもらいたいと考えているので、他に方法がないか考えているのですが… どうかよろしくお願い致します。

  • php と C# の ビット演算

    PHPでビット演算をしていますが、 PHPでたとえば、 c = a >> b でビット演算した値と、 C#で演算した値と aの値を大きくした場合、 4000000000以上? は結果が違ってきます。 C#とPHPではビット演算のアルゴリズムが違うのでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • C# こういう場合ってどうなるの?

    public void A(bool b) {   if(b ? B() : C())//分かると思いますが、三項演算子   {     //略   } } public bool B() {   return true; } public bool C() {   return false } 上記のAにtrueを渡し実行した場合、 if文の中はどうなるのでしょうか? 引数がtrueならBを実行し、Bの戻り値trueが if文で処理され、if内に入る・・・でよろしいのでしょうか? それとも引数bの評価がそのままifで使われるのでしょうか? 例えばのコードなので、bだろうがBだろうが変わらない・・・みたいな 回答はご遠慮ください。

  • Excelでセルの演算による表示

    どなたかご教授頂けたらと思います。 セル(例えばA1)に別セルの演算結果(例えばB1)が0以下(マイナス含む)ならば"0"と表示し、 別のセル(例えばC1)以上であったら、"C1"値を表示させたいのですが、うまくいきません。 IFを使用したら、うまくいきそうなのですが… ■0以下ならば"0"を表示 A1=IF(ISBLANK(B1),"",IF(B1<0,0,B1)) ■C1値以上であった場合、"C1"値を表示 A1=IF(ISBLANK(B1),"",IF(B1>C1,C1,B1)) ※0~C1範囲の結果の場合には"B1"値をそのまま表示 宜しくお願い致します。

  • これはAnd演算に変えてよいか?

     こんにちは。c#初心者です。今回はcで共通する部分(のはず)なのでc#でなくても回答できると思います。  最初はこういうコードを書いていました。 (a, b, cはint、switchOnはbool値です) int value; if ( switchOn ) value = a + b + c; else value = a + b; これを (a, b, c, maskはint。またmaskは0または111……111) int value = a + b + (c & mask); のようにifを使わない形にしてもいいのでしょうか?  この部分は今後とも変更・メンテナンスの必要が特になく、他のクラスの中に埋め込まれるクラスのメソッドで、特に第三者が見る事・必要もほとんど無く(もとい、チームとかありませんから)、可読性が重要視される訳ではないのですが、速度が重視される訳でもないんですね。  とりあえず、後者のほうを選んでも、特にデメリットはないのですが(かといってメリットもあまり無いのですが)、使えるなら予備知識になると思い、質問させていただきました。  どなたか詳しい方、いらっしゃいましたら教えていただけませんか?

  • Objective-c 3項演算子で代入できない

    Objective-c 2.0で3項演算子を用いてプロパティに代入演算子で代入を行おうとすると Expression is not assignableエラーになります。 なぜでしょうか? 1.エラーになる例 UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 100)]; BOOL flag = YES; flag == YES ? label.text = @"a" : label.text = @"b"; // ここでエラー 2.3行目をsetTextメッセージに置き換えるとエラーは出なくなります。 flag == YES ? [label setText:@"a"] : [label setText:@"b"]; // これはOK 3.if文に置き換えてもエラーは出ません。 if(flag == YES) label.text = @"a"; // これもOK else label.text = @"b"; // これもOK 1.と2.の書き方は等価だと思っていたのですが、どうやら等価ではないということは わかりました。では、どう違うのかというと、そこまでの理解には自力では至れませんでした。 1.だとnot assignableなのに3.だと問題ない理由もわかりません。 何か理解のためのヒントをいただけないでしょうか? よろしくお願いします。 環境: XCode Version 4.3.2 (4E2002) Apple LLVM Compiler 3.1

  • JavaでC言語のポインタ演算風な使い方は

    Java初心者です。ずっとC言語をやっていました。 Javaにはポインタは存在せず(実際は参照渡しなのでポインタその ものなのですが)、ポインタに対する演算はありませんよね。 C言語で、 int buf[2*10]; int *dst = buf; for(i=0;i<10;i++){ dst[0]=a; dst[1]=b; dst += 2; } のようなソースをJavaで書こうとすると、 for(i=0;i<10;i++){ buf[i*2+0]=a; buf[i*2+1]=b; } しか思いつきません。 コンパイルして最適化されれば問題ないと思いますが、 なんか配列中の演算が演算量をとりそうで、気になっています。 もっと高速に処理されるような書き方はないものでしょうか? アドバイスよろしくお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう