1バイトからいくつかの値を読み取っています。ユーザーマニュアルで、この1バイトには3つの異なる値が含まれていると言われています。次のようなテーブルがあります。
これは、精度が3ビット、スケールが2、サイズが3で、合計8(1バイト)であることを意味すると解釈します。
私がはっきりしていないのは:
1-なぜ0から7ではなく7から0のラベルが付けられているのですか(おそらく重要性と関係がありますか?)
2-その1バイトから個々の値を抽出するにはどうすればよいですか?
1バイトからいくつかの値を読み取っています。ユーザーマニュアルで、この1バイトには3つの異なる値が含まれていると言われています。次のようなテーブルがあります。
これは、精度が3ビット、スケールが2、サイズが3で、合計8(1バイト)であることを意味すると解釈します。
私がはっきりしていないのは:
1-なぜ0から7ではなく7から0のラベルが付けられているのですか(おそらく重要性と関係がありますか?)
2-その1バイトから個々の値を抽出するにはどうすればよいですか?
バイト内のビットには、その重要性に応じて番号を付けるのが通例です。ビットx
はを表し2^x
ます。この番号付けスキームによれば、最下位ビットは番号0になり、次のビットは番号1になり、以下同様に続きます。
個々のビットを取得するには、シフトとマスキング操作が必要です。
var size = (v >> 0) & 7;
var scale = (v >> 3) & 3;
var precision = (v >> 5) & 7;
取得する必要のある右端の部分の右側のビット数だけシフトします(ゼロによるシフトは無視されます。説明のために追加しました)。
取得したいビット数に適合する最大数のマスク:1ビットの場合は1、2ビットの場合は3、ビットの場合は3ビットの場合は2^x-1
7 x
。
シフトとマスクを実行するか、BitArrayクラスを使用できます:http://msdn.microsoft.com/en-us/library/system.collections.bitarray.aspx
BitVector32の例:
BitVector32 bv = new BitVector32(0);
var size = BitVector32.CreateSection(7);
var scale = BitVector32.CreateSection(3, size);
var precision = BitVector32.CreateSection(7, scale);
bv[size] = 5;
bv[scale] = 2;
bv[precision] = 4;
LINQPad出力:
Potayto、potahto。
シフトとマスクを使用して、次のように不要なビットを平坦化します。
byte b = something; // b is our byte
int size = b & 0x7;
int scale = (b >> 3) & 0x3;
int position = (b >> 5) & 0x7;
1.はい、通常、最上位ビットが最初に書き込まれます。バイトが整数として解釈される場合、そのビットが設定されると値2 7(= 128)になるため、左端のビットには7のラベルが付けられます。
これは完全に自然なことであり、実際には10進数の書き方とまったく同じです(最上位桁が最初)。たとえば、356という数字は(3 x 10 2)+(5 x 10 1)+(6 x 10 0)です。
2.完了するために、他の回答で述べられているように、ビットシフトとビット単位の演算子を使用して個々の値を抽出できます。
int size = x & 7;
int scale = (x >> 3) & 3;
int precision = (x >> 5) & 7;
重要な注意:これは、個々の値が正の整数として解釈されることを前提としています。値が負になる可能性がある場合、これは正しく機能しません。変数の名前を考えると、これがここで問題になる可能性はほとんどありません。
これは、ビット単位の演算を介して行うことができます。
uint precision = (thatByte & 0xe0) >> 5,
scale = (thatByte & 0x18) >> 3,
size = thatByte & 7;