5

2 つの値を含む 1 バイトがあります。ドキュメントは次のとおりです。

権限バイトは 2 つのフィールドに分割されます。最下位 3 ビットは、ユーザーの権限レベル (0 から 5) を運びます。最上位 5 ビットには、オーバーライド拒否しきい値があります。これらのビットがゼロに設定されている場合、システム拒否しきい値を使用して、このユーザーのスコアが承認または拒否と見なされるかどうかが決定されます。それらがゼロでない場合、これらのビットに 10 を掛けた値が、このユーザーのしきい値スコアになります。

権限バイト:

7 6 5 4 3 ......... 2 1 0
Reject Threshold .. Authority

C# でビットを操作した経験はありません。

上記のように、バイトを変換して値を取得するのを手伝ってもらえますか?

私は次のコードを試しました:

BitArray BA = new BitArray(mybyte); 

しかし、長さは 29 として返され、バイトの各ビットである 8 を期待していました。

-- みんなの迅速な助けに感謝します。動作するようになりました。すごいインターネット。

4

4 に答える 4

7

BitArrayの代わりに、次のように、組み込みのビットごとの ANDおよび右シフト演算子をより簡単に使用できます。

byte authorityByte = ...

int authorityLevel = authorityByte & 7;
int rejectThreshold = authorityByte >> 3;

1 バイトを戻すには、ビットごとのOR左シフト演算子を使用できます。

int authorityLevel = ...
int rejectThreshold = ...

Debug.Assert(authorityLevel >= 0 && authorityLevel <= 7);
Debug.Assert(rejectThreshold >= 0 && rejectThreshold <= 31);

byte authorityByte = (byte)((rejectThreshold << 3) | authorityLevel);
于 2013-07-08T09:58:07.360 に答える
6

の使い方BitArrayが間違っています。これ:

BitArray BA = new BitArray(mybyte);

..暗黙的にに変換されますint。その場合、このコンストラクターをトリガーしています。

BitArray(int length);

..したがって、特定の長さで作成します。

MSDN ( http://msdn.microsoft.com/en-us/library/x1xda43a.aspx ) を見ると、次のようになります。

BitArray BA = new BitArray(new byte[] { myByte });

長さは 8 になります (予想どおり)。

于 2013-07-08T09:57:07.337 に答える
4

バイトの最上位 5 ビットの値を整数として取得するには、次のように、バイトを右にシフトし3(つまり、だけ)、ビット演算8-5を使用して上位 3 ビットをゼロに設定します。AND

byte orig = ...
int rejThreshold = (orig >> 3) & 0x1F;
  • >>「右シフト」演算子です。ビット 7..3 を位置 4..0 に移動し、下位 3 ビットを削除します。
  • 0x1Fは 2 進数00011111で、上位 3 ビットがゼロに設定され、下位 5 ビットが 1 に設定されています。ANDこの数値を -ing すると、上位 3 ビットがゼロになります。

この手法は、他のビット パターンや他の整数データ型を取得するために一般化できます。必要なビットを最下位の位置にシフトし、必要なビット数を「切り取る」マスクを適用します。場合によっては、シフトが必要ない場合もあります (たとえば、ビットの最下位グループを取得する場合)。上記のような他の場合では、符号なし型でビットの最上位グループを取得するため、マスキングは必要ありません (型が符号付きの場合はANDing が必要です)。

于 2013-07-08T09:57:07.557 に答える
3

間違ったコンストラクターを使用しています (おそらく)。

あなたが使っているのはおそらくこれですが、これが必要です:

var bitArray = new BitArray(new [] { myByte } );
于 2013-07-08T09:56:39.350 に答える