C#プログラミング初心者です。


byte型の変数bbbに、'0'から'F'までのアスキーコードの文字が1文字入っています。

このbbbの内容をビットフィールドとして扱い、指定ビットが立っているかどうかの
判別をしたいのですが、どのようにプログラムしたらよいのでしょうか?


'1'が入っている場合は、二進数で表現すると0001なので0ビット目が立っています。
'2'が入っている場合は、二進数で表現すると0010なので1ビット目が立っています。

という感じです。

よろしくおねがいいたします。

回答の条件
  • 1人2回まで
  • 登録:2007/12/13 13:34:41
  • 終了:2007/12/17 12:53:36

ベストアンサー

id:takabow No.5

noname回答回数51ベストアンサー獲得回数142007/12/14 04:33:20

ポイント40pt

byte型の変数bbbに、'0'から'F'までのアスキーコードの文字が1文字入っています

アスキーコードが入ってる前提でしたね、読み落としてましたすみません。

こちらの解答に対するポイントはスルーしてください。

 

ご存じかもしれませんが、アスキーコードと実際の数字の関係は、0x30を引いた関係にあります。

たとえば '9'はbyteでは0x39という扱いになりますので、

'9' - 0x30 = 0x09 = 9

という感じです。ですから、比較する前の時点で0x30を引けばよいので、

switch( (BitField)(bbb-0x30) )
{
    case BitField.Bit0001:
        System.Consol.WriteLine("1つ目のビットが立ってます");
        break;
}

ですとか、

bool CheckBitField(byte bbb, BitField mask)
{
    return (bbb-0x30) == (byte)mask;
}

といった感じで事前に変換(0x30を引く)しておけばOKです。

その他の回答(4件)

id:mj99 No.1

mj99回答回数138ベストアンサー獲得回数382007/12/13 15:12:19

ポイント20pt
private bool isON(byte aaa, int bit)
{
   return (aaa & (byte)Math.Pow(2, bit)) != 0;
}

ビットのON/OFFをboolで返す関数。

引数bitには0~7を与えてください。

id:degucho No.2

degucho回答回数254ベストアンサー獲得回数682007/12/13 16:02:12

ポイント20pt

古典的なビットパターンでマスクするやりかたを

試してみました。

        private void button1_Click(object sender, EventArgs e)
        {

            byte bbb;
            bool result;

            int mask = Convert.ToInt32("0001", 2);

            bbb = Convert.ToByte('A');
            result = ((bbb & mask) == mask);

            MessageBox.Show(Convert.ToString(bbb,2)
                            + " AND " + Convert.ToString(mask, 2)
                            + "=" + result.ToString()
                           );

            
            bbb = Convert.ToByte('B');
            result = ((bbb & mask) == mask);

            MessageBox.Show(Convert.ToString(bbb, 2)
                            + " AND " + Convert.ToString(mask, 2)
                            + "=" + result.ToString()
                           );

        }

’A’はTrue,'B'はFalseになります

http://ufcpp.net/study/csharp/st_operator.html#logical

id:hissssa No.3

hissssa回答回数421ベストアンサー獲得回数1272007/12/13 17:08:08

ポイント20pt

単に>>演算子を使えば済むんでは?。

if( ( (bbb >> bit)&1 ) !=0 ) { .... } って感じで。

id:takabow No.4

noname回答回数51ベストアンサー獲得回数142007/12/14 02:01:35

ポイント20pt

ビットフィールドを使うのでしたらenumで表現するのがよいかと思います。

変数名はあくまで一例ですが、

enum BitField : byte
{
    Bit0000 = 0,
    Bit0001 = 1,
    Bit0010 = 2,
    Bit0100 = 4,
    Bit1000 = 8
}

のような感じで定義します。

通常は用途に応じて意味のある名前にします。

 

あとはどのようにも使いまわせます。

以下は私なりの書き方なので一般的か怪しいところもありますが、

例えばswitch文で使うなら

static void Main(string[] args)
{
    byte bbb = 9; //1001

    switch ((BitField)bbb)
    {
        case BitField.Bit0010:
            System.Console.WriteLine("最下位から2ビット目が立ってます。");
            break;
        case (BitField.Bit1000 | BitField.Bit0001) :
            System.Console.WriteLine("最上位ビットと最下位ビットが立っています。");
            break;
        default:
            System.Console.WriteLine("その他です。");
            break;
    }
}

のような感じで実行すると、

"最上位ビットと最下位ビットが立っています。"

という出力が得られます。

 

また、どのビットが立っているかチェックする関数を作るのでしたら、

static void Main(string[] args)
{
    byte bbb = 9; //1001

    bool result = CheckBitField(bbb, BitField.Bit1000 | BitField.Bit0001);
}

static bool CheckBitField(byte bbb, BitField mask)
{
    return bbb == (byte)mask;
}

といったboolを返す関数を作って実行すれば、この場合resultにtrueが入ります。

id:takabow No.5

noname回答回数51ベストアンサー獲得回数142007/12/14 04:33:20ここでベストアンサー

ポイント40pt

byte型の変数bbbに、'0'から'F'までのアスキーコードの文字が1文字入っています

アスキーコードが入ってる前提でしたね、読み落としてましたすみません。

こちらの解答に対するポイントはスルーしてください。

 

ご存じかもしれませんが、アスキーコードと実際の数字の関係は、0x30を引いた関係にあります。

たとえば '9'はbyteでは0x39という扱いになりますので、

'9' - 0x30 = 0x09 = 9

という感じです。ですから、比較する前の時点で0x30を引けばよいので、

switch( (BitField)(bbb-0x30) )
{
    case BitField.Bit0001:
        System.Consol.WriteLine("1つ目のビットが立ってます");
        break;
}

ですとか、

bool CheckBitField(byte bbb, BitField mask)
{
    return (bbb-0x30) == (byte)mask;
}

といった感じで事前に変換(0x30を引く)しておけばOKです。

  • id:stepwgn24z
    みなさま回答ありがとうございました。
    まだ、試せてはいませんが、これから試してみようと思います。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません