如何处理字节中的位

本文关键字:字节 处理 何处理 | 更新日期: 2023-09-27 18:21:39

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

权限字节分为两个字段。三个最低有效位携带用户的权限级别(0-5)。五大有效位携带覆盖拒绝阈值。如果这些位如果设置为零,则系统拒绝阈值用于确定该用户的分数被认为是接受或拒绝。如果是不为零,则这些位的值乘以10将成为该用户的阈值分数。

权威字节:

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

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

有人能帮我转换一个字节并获得上面提到的值吗?

我尝试了以下代码:

BitArray BA = new BitArray(mybyte); 

但长度回到了29,我本以为是8,即字节中的每一位。

--感谢大家的快速帮助。现在开始工作了!很棒的互联网。

如何处理字节中的位

您可以更容易地使用内置的按位AND和右移运算符,而不是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);

您对BitArray的使用不正确。此:

BitArray BA = new BitArray(mybyte);

将被隐式地转换为CCD_ 2。当这种情况发生时,您将触发这个构造函数:

BitArray(int length);

因此,它创造了一个特定的长度。

查看MSDN(http://msdn.microsoft.com/en-us/library/x1xda43a.aspx)你想要这个:

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

长度将为8(如预期)。

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

byte orig = ...
int rejThreshold = (orig >> 3) & 0x1F;
  • >>是"右移"运算符。它将第7..3位移动到第4..0位,从而丢弃较低的三位
  • 0x1F是二进制数00011111,其具有设置为零的高位三位和设置为一的低位五位。用这个数字AND将三个高位置零

这种技术可以推广到获得其他位模式和其他积分数据类型。将所需的位移到最低有效位,然后应用一个掩码来"剪切"所需的位数。在某些情况下,移位是不必要的(例如,当您获得最低有效位组时)。在其他情况下,如上面所述,屏蔽是不必要的,因为您在无符号类型中获得最高有效位组(如果该类型是有符号的,则需要ANDing)。

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

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

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