人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

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


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

という感じです。

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

●質問者: inu
●カテゴリ:コンピュータ
✍キーワード:byte C# いるか アスキー コード
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

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

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

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


2 ● degucho
●20ポイント

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

試してみました。

 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


3 ● hissssa
●20ポイント

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

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


4 ● noname
●20ポイント

ビットフィールドを使うのでしたら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が入ります。


5 ● noname
●40ポイント ベストアンサー

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です。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ