如何使用一个字节中的位

时间:2013-07-08 09:52:10

标签: c# byte

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

  

权限字节分为两个字段。三个最低有效位带有用户的权限级别(0-5)。五个最多   有效位带有覆盖拒绝阈值。如果这些位是   设置为零,系统拒绝阈值用于确定是否   该用户的分数被视为接受或拒绝。如果它们是   不是零,那么这些位的值乘以十将是   该用户的门槛评分。

     

授权字节:

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

我没有任何使用C#中的位的经验。

有人可以帮我转换字节并获得上述值吗?

我尝试过以下代码:

BitArray BA = new BitArray(mybyte); 

但是长度又回到了29,而我预计会有8个,就是字节中的每个位。

- 感谢大家的快速帮助。现在就搞定了!很棒的互联网。

4 个答案:

答案 0 :(得分:7)

您可以更轻松地使用内置的BitArraybitwise AND运算符代替right-shift,而不是:

byte authorityByte = ...

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

要获得单字节,您可以使用bitwise ORleft-shift运算符:

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

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

byte authorityByte = (byte)((rejectThreshold << 3) | authorityLevel);

答案 1 :(得分: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(如预期的那样)。

答案 2 :(得分:4)

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

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

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

答案 3 :(得分:3)

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

您正在使用的那个可能是this one,而您需要this one

var bitArray = new BitArray(new [] { myByte } );