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

このQ&Aのポイント
  • ASP.NETでビット演算ができません。開発環境はVisual Studio 2005(.NET Framework Ver:2.0.50727)で、言語はC#です。
  • ソースコード内の「if (bStatus & …)」の部分で、「型'int'を型'bool'に暗黙的に変換できません。」というエラーが発生しています。
  • ビット演算を行いたい場合、別の方法を検討する必要があります。
回答を見る
  • ベストアンサー

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'に暗黙的に変換できません。」というエラーになります。

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

  • ベストアンサー
  • dsuekichi
  • ベストアンサー率64% (171/265)
回答No.1

「bool (C# リファレンス)」 (http://msdn2.microsoft.com/ja-jp/library/c8f5xwh7(VS.80).aspx) の「変換」に、記述がありますね。

szkatnr
質問者

お礼

返事がおそくなってごめんなさい。 C#は、きちんと if (aaa & bbb != 0) まで書かないといけないんですね。 参考になりました。

関連するQ&A

  • 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"); }

  • これは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を使わない形にしてもいいのでしょうか?  この部分は今後とも変更・メンテナンスの必要が特になく、他のクラスの中に埋め込まれるクラスのメソッドで、特に第三者が見る事・必要もほとんど無く(もとい、チームとかありませんから)、可読性が重要視される訳ではないのですが、速度が重視される訳でもないんですね。  とりあえず、後者のほうを選んでも、特にデメリットはないのですが(かといってメリットもあまり無いのですが)、使えるなら予備知識になると思い、質問させていただきました。  どなたか詳しい方、いらっしゃいましたら教えていただけませんか?

  • javaのソケット通信の受信で、InputStreamの終了が認識出来

    javaのソケット通信の受信で、InputStreamの終了が認識出来ません。 (1)下記のネット上で見つけたチャットクライアントのソース"ChatClient.java"を流用しました。  http://www.saturn.dti.ne.jp/~npaka/android/SocketEx/index.html  チャットサーバもこのサイトのソースを実装しました。この組み合わせで送受信は確認しました。 (2)これを下記のjavaのオープンソースを実装して、バイト読み出しに変更しました。  ・上記の元のソースの受信ループ中の読み出し部   size=in.read(w); → size=readsocket(w);  【"java\io\InputStream.java"より】   public int read(byte b[]) throws IOException {  //※1     return read(b, 0, b.length);      //※2   }   public int readsocket2(byte b[], int off, int len) throws IOException {//※3     if (b == null) {       throw new NullPointerException();     } else if ((off < 0) || (off > b.length) || (len < 0) ||         ((off + len) > b.length) || ((off + len) < 0)) {       throw new IndexOutOfBoundsException();     } else if (len == 0) {       return 0;     }     int c = read();    //※4     if (c == -1) {       return -1;     }     b[off] = (byte)c;     int i = 1;     try {       for (; i < len ; i++) {       c = in.read();       if (c == -1) {         break;       }       if (b != null) {         b[off + i] = (byte)c;       }       }     } catch (IOException ee) {     }     return i;   } ・上記の名前の付け替え   ※1:public int readsocket(byte b[]) throws IOException {   ※2:return readsocket2(b, 0, b.length);   ※3:public int readsocket2(byte b[], int off, int len) throws IOException {   ※4:int c = in.read(); (3)この変更を行うと、“in.read()”でストリームの終了の"-1"が入って来ず、forループから抜けなくなってしまいました。帰って来るのは送信したコードのみです。どこが悪いのでしょうか?

    • ベストアンサー
    • Java
  • ソケット通信の受信で、InputStreamの終了が認識出来ません。

    ソケット通信の受信で、InputStreamの終了が認識出来ません。 (1)下記のネット上で見つけたチャットクライアントのソース"ChatClient.java"を流用しました。  http://www.saturn.dti.ne.jp/~npaka/android/SocketEx/index.html (2000文字を超えるので掲載出来ません)  チャットサーバもこのサイトのソースを実装しました。この組み合わせで送受信は確認しました。 (2)これに下記のjavaのオープンソースを実装して、バイト読み出しに変更します。  【"java\io\InputStream.java"より】   public int read(byte b[]) throws IOException {  //※1     return read(b, 0, b.length);      //※2   }   public int read(byte b[], int off, int len) throws IOException {//※3     if (b == null) {       throw new NullPointerException();     } else if ((off < 0) || (off > b.length) || (len < 0) ||         ((off + len) > b.length) || ((off + len) < 0)) {       throw new IndexOutOfBoundsException();     } else if (len == 0) {       return 0;     }     int c = read();    //※4     if (c == -1) {       return -1;     }     b[off] = (byte)c;     int i = 1;     try {       for (; i < len ; i++) {       c = in.read();       if (c == -1) {         break;       }       if (b != null) {         b[off + i] = (byte)c;       }       }     } catch (IOException ee) {     }     return i;   }  ・リンク先のソース中の入力ストリーム読み出し部の名前の付け替え  size=in.read(w); → size=readsocket(w);  ・javaのオープンソース"java\io\InputStream.java"中の名前の付け替え   ※1:public int readsocket(byte b[]) throws IOException {   ※2:return readsocket2(b, 0, b.length);   ※3:public int readsocket2(byte b[], int off, int len) throws IOException {   ※4:int c = in.read(); (3)この変更を行うと、※4の“in.read()”で入力ストリームの終了の"-1"が入って来ず、forループから抜けなくなってしまいました。帰って来るのは送信したコードのみです。どこが悪いのでしょうか?

    • ベストアンサー
    • Java
  • 文字列クラスを作りたいと思っています

    文字列クラスを作りたいと思っています。 以下のようなところまでは作れましたが、 エラーがでてしまいます。 どこかおかしいところがあるのでしょうか? *********************************************** #include<stdio.h> #include<string.h> class stt { public: char *str; int len; bool maked; stt::stt() { len=0; str=NULL; maked=false; } stt::~stt() { delete[] str; } stt &operator =(char *c) { if(maked) { delete[] str; maked=false; } len=strlen(c); str=new char[len]; strcpy(str,c); maked=true; return (*this); } virtual operator char*() { return str; } }; int main() { stt s; s="Hello World"; printf(s); getchar(); return 0; } ***********************************************

  • 仮想基底クラスをもつクラスの代入演算2

    <仮想基底クラスをもつクラスの代入演算>の続きですが、結局、assign のようなものを作って、以下のように書くのが一番いいのでしょうか。。。 ====(一応、自己代入も考慮して書くと^^) #include <algorithm> struct X { int x; X &assign(const X &z, bool top) { if (this != &z) x = z.x; return *this; } X &operator=(const X &z) { return assign(z, true); } }; struct A : virtual X { int a; A &assign(const A &z, bool top) { if (this != &z) { if (top) X::assign(z, false); a = z.a; } return *this; } A &operator=(const A &z) { return assign(z, true); } }; struct B : virtual X { int b; B &assign(const B &z, bool top) { if (this != &z) { if (top) X::assign(z, false); b = z.b; } return *this; } B &operator=(const B &z) { return assign(z, true); } }; struct C : A, B { int c; C &assign(const C &z, bool top) { if (this != &z) { if (top) X::assign(z, false); A::assign(z, false); B::assign(z, false); c = z.c; } return *this; } C &operator=(const C &z) { return assign(z, true); } }; ==== ただ、<仮想基底クラスをもつクラスの代入演算>で、jacta さんが提示してくださった方法も、処理量は増えますが、アロケートする必要があるポインタなどのデータメンバのアロケートやデリートする処理コードをコンストラクタに集中できるので、「コーディング量の減少・改変の際の修正し忘れの可能性を低くできる」というメリットがあると思います。ハンドルクラスやコンテナクラスを実装する際は、swap() 機能が必要となると考えられるので、jacta さんのコピーコンストラクタでコピー代入を実装する方法の方がいいのかとも思います。 みなさん、どう思われますか? また、そのほかに、効果的なテクニックがあれば、ぜひ、ご教示ください。

  • 解けません!

    http://www.pref.fukushima.jp/pc-concours/2008/03/pdf/2007honsen.pdf この問題03の宅配料金の問題が解けません!! 書かれている入力例と出力例はあっているのですが、 学校のジャッジシステムが受けつけてくれません。 どなたか僕のプログラムの不備を見つけて下さい。 お願いします。 #include <stdio.h> int ryoukin(int x, int y, int h, int w) { int i,t,c; i = x + y + h; if (i <= 60) t = 600; else if (i <= 80) t = 800; else if (i <= 100) t = 1000; else if (i <= 120) t = 1200; else if (i <= 140) t = 1400; else if (i <= 160) t = 1600; else t = 0; if (w <= 2) c = 600; else if (w <= 5) c = 800; else if (w <= 10) c = 1000; else if (w <= 15) c = 1200; else if (w <= 20) c = 1400; else if (w <= 25) c = 1600; else c = 0; if (t == 0) return 0; else if (c == 0) return 0; else if (t < c) return c; else return t; } int main(void) { int x,y,h,w,n,i,sum; sum = 0; while(n != 0){ scanf("%d",&n); if(n != 0){ for(i = 0; i < n; i++){ scanf("%d %d %d %d", &x, &y, &h, &w); sum = sum + ryoukin(x,y,h,w); } printf("%d\n",sum); sum = 0; } } return (0); }

  • テーブルからの検索一番近いインデックスを取得

    こんにちは。 floatのテーブルからどこに一番近いかを知りたいのですがどのようにしたらよろしいのでしようか。 単純に二分探索でやってみましたが検索順序の関係で必ずしも近いところになりません。 ------------------------------------------------------------------ int binSearch( float fKey, const float* tblfData, int nNumData ) { int nFirst = 0 ; int nLast = nNumData - 1 ; int nComp ; float nComped ; // 探索範囲がなくなったら終了 while( nLast - nFirst > 0 ) { nComp = ( nFirst + nLast ) / 2 ; nComped = tblfData[ nComp ] - fKey ; if(fabsf( nComped ) <= FLT_EPSILON ) { return nComp ; } if(nComped <= 0 ) { nFirst = nComp + 1 ; } else { nLast = nComp - 1 ; } } if(nLast - nFirst < 0 ) { return nLast ; } return nFirst ; } int _tmain(int argc, _TCHAR* argv[]) { float tblsData[ 10 ] ; tblsData[ 0 ] = 0.000f ; tblsData[ 1 ] = 0.025f ; tblsData[ 2 ] = 0.050f ; tblsData[ 3 ] = 0.075f ; tblsData[ 4 ] = 0.100f ; tblsData[ 5 ] = 0.125f ; tblsData[ 6 ] = 0.150f ; tblsData[ 7 ] = 0.175f ; tblsData[ 8 ] = 0.200f ; tblsData[ 9 ] = 0.225f ; int i ; float fKey = -0.01f ; int nRet ; for( i=0; i<40; i++ ) { nRet = binSearch( fKey, tblsData, 10 ) ; if( nRet >= 0 ) { printf( "%.3f : %d : %.3f\n", fKey, nRet, tblsData[ nRet ] ) ; } else { printf( "%.3f :error\n", fKey ) ; } fKey += 0.01f ; } return 0 ; } ------------------------------------------------------------------ 上記のソースで0.060のとき0.050に近いのでbinSearchの戻り値は2を期待したいのですが、 3が返ってきてしまいます。 二分探索しか知りませんでしたので試してみましたが他の方法でもっと適切なのがありましたら 教えていただけないでしょうか。

  • operator +()について

    --------------------------------------- 文字列クラスを作りたいと思っています。 以下のようなところまでは作れましたが、 全てのstrをdelete[] str;しているのかわかりません。 delete[] str;を確認するにはどうすればいいですか? --------------------------------------- #include<stdio.h> #include<string.h> #include<conio.h> class stt { public: char *str; int len; bool maked; stt::stt() { len=0; str=NULL; maked=false; } stt::~stt()// ちゃんとデストラクタ内で、全てのstrがdeleteされているのでしょうか? { if(maked) { delete[] str; } else { maked=true; } } stt &operator =(char *c) { if(maked) { delete[] str; maked=false; } len=strlen(c); str=new char[len+1]; strcpy(str,c); maked=true; return (*this); } stt &operator =(stt &ste) { if(maked) { delete[] str; maked=false; } len=strlen(ste.str); str=new char[len+1]; strcpy(str,ste.str); maked=true; return (*this); } stt operator +(stt ste) { stt tet; int len1=strlen(str); int len2=strlen(ste.str); tet.str=new char[len1+len2+2]; strcpy(tet.str,str); strcat(tet.str,ste.str); tet.str[len1+len2+1]='\0'; ste.maked=false;//不安部分 return tet; } virtual operator char*() { return str; } }; int main() { stt ss,ww,pp; ss="a"; ww="b"; pp=ss+ww; printf(pp); printf("\n"); getchar(); return 0; }

  • if文の演算子について

    if文の演算子について int a=0,b=1,c=1,d=1; if(a==1 && b==1 && c==1 ||d==1){ Printf("yes"); }else{ Printf("no"); } if((a==1 && b==1 && c==1 )||d==1){ Printf("yes2"); }else{ Printf("no2"); } } 上記のif文で出力結果が異なります。 if((a==1 && b==1 && c==1 )||d==1)の方はa=1、b=1、c=1の時もしくはd=1の時と 理解できるのですが、 if(a==1 && b==1 && c==1 ||d==1)の方は、どういう条件の時が当てはまるのでしょうか?