C#,位和字节 – 如何从字节中检索位值?

我正在从一个字节读取一些值。 我在用户手册中告诉我,这一个字节包含3个不同的值。 有一个看起来像这样的表:

位表

我认为这意味着精度占用3位,比例占用2,大小占3,总共8(1字节)。

我不清楚的是:

1 – 为什么它标记为7到0而不是0到7(可能与有意义有关?)

2 – 如何从该字节中提取单个值?

通常根据字节的重要性对字节中的位进行编号:位x表示2^x 。 根据这种编号方案,最低有效位为零,下一位为第一,依此类推。

获取单个位需要移位和屏蔽操作:

 var size = (v >> 0) & 7; var scale = (v >> 3) & 3; var precision = (v >> 5) & 7; 

按你需要得到的最右边部分右边的位数移动(忽略移位;我为了说明目的添加了它)。

具有最大数量的掩码,它适合您希望获得的位数:1表示1位,3表示2位,7表示3位, 2^x-1表示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输出:

LINQPad输出

  1. Potayto,potahto。

  2. 您可以使用移位和掩码来平滑不需要的位,例如:

     byte b = something; // b is our byte int size = b & 0x7; int scale = (b >> 3) & 0x3; int position = (b >> 5) & 0x7; 

是的,最重要的一点通常是先写的。 最左边的位标记为7,因为当字节被解释为整数时,该位在设置时具有值2 7 (= 128)。

这是完全自然的,实际上与您编写十进制数字的方式完全相同(最重要的数字首先)。 例如,数字356是(3×10 2 )+(5×10 1 )+(6×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;