5

我有一个包含两个值的字节。这是文档:

权限字节分为两个字段。三个最低有效位携带用户的权限级别(0-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,您可以更轻松地使用内置的按位与右移运算符,如下所示:

byte authorityByte = ...

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

要取回单个字节,您可以使用按位 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

要将字节中五个最高有效位的值作为整数,请将字节向右移动3(即按8-5),并使用按位运算将高三个位设置为零AND,如下所示:

byte orig = ...
int rejThreshold = (orig >> 3) & 0x1F;
  • >>是“右移”运算符。它将位 7..3 移动到位置 4..0,丢弃三个低位。
  • 0x1F是二进制数00011111,其高三位设置为零,低五位设置为一。AND用这个数字 -ing 将三个高位清零。

这种技术可以推广到其他位模式和其他整数数据类型。您将所需的位移动到最不重要的位置,并应用一个掩码来“删除”您想要的位数。在某些情况下,不需要移位(例如,当您获得最低有效位组时)。在其他情况下,例如上面,屏蔽不是必需的,因为您获得了无符号类型中最重要的位组(如果类型是有符号的,AND则需要 ing )。

于 2013-07-08T09:57:07.557 回答
3

您使用了错误的构造函数(可能)。

您正在使用的可能是这个,而您需要这个

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