こんにちは。


WindowsCE5.0で動作するアプリをVC#を使って開発しています。

このアプリで、ICタグにデータを書き込むのですが、書き込むデータを変数に格納する際に
どうしてもビットフィールドを使いたいのです。

いろいろ調べていたら、C#ではビットフィールドが使えないようなことが書いて
あったのですが、なにか代替する方法はありますでしょうか。

要は、やりたいことは、1バイトのデータを5ビット+3ビットのように分割して扱いたいのです。

C#ではできない場合、VBではできますでしょうか?その場合はどのようにすればVBで
ビットフィールドが使えるのでしょうか?

よろしくお願いいたします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2009/05/21 17:40:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答3件)

id:hijk05 No.1

回答回数1307ベストアンサー獲得回数23

ポイント27pt

>要は、やりたいことは、1バイトのデータを5ビット+3ビットのように分割して扱いたいのです。

整数型変数に格納して、自前で分割すればよいですが・・・。

id:ardarim No.2

回答回数897ベストアンサー獲得回数145

ポイント27pt

論理演算子を使って手計算で分割/結合すればよいと思います。大して難しいということもありません。


dataがバイトデータだとすると、

上位5ビットは hi = (data >> 3) & 0x1F

下位3ビットは lo = (data & 0x07)

で得られます。


結合する場合は、

data = (hi << 3) | lo

です。

より厳密にしたければ

data = ((hi & 0x1F) << 3) | (lo & 0x07)

id:kantodaki No.3

回答回数9ベストアンサー獲得回数1

ポイント26pt

Flags属性を利用しましょう。

下記のような形で利用できます。


class Program

{

[System.Flags]

enum BitField : byte

{

Empty = 0,

LF1 = 1,

LF2 = 2,

LF3 = 4,

LF4 = 8,

LF5 = 16,

LFMAX = 31,

HF1 = 32,

HF2 = 64,

HF3 = 128,

HFMAX = 224,

}

static void Main(string[] args)

{// LF1とHF2以外のフラグを立てたfieldを作成

BitField field = ~BitField.LF1 & ~BitField.HF2;

if (BitField.LF2.Equals(field & BitField.LF2))

{// LF2フラグが立つ場合、fieldに含まれるLFフラグを表示

System.Console.WriteLine(field & BitField.LFMAX);

}

}

}

コメントはまだありません

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

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

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

回答リクエストを送信したユーザーはいません