C#,位& bytes - 如何从字节中检索位值?

时间:2012-10-02 13:17:37

标签: c#

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

bit table

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

我不清楚的是:

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

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

5 个答案:

答案 0 :(得分:18)

通常根据字节的重要性对字节中的位进行编号:位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位。

答案 1 :(得分:6)

你可以做班次和面具,或者你可以使用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 output

答案 2 :(得分:5)

  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;
    

答案 3 :(得分:4)

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

这是完全自然的,实际上与您编写十进制数字的方式完全相同(最重要的数字首先)。例如,数字356是(3×10 b 2 )+(5×10 b 1 )+( 6 x 10 b 0 )。

2。完成后,如其他答案中所述,您可以使用位移和按位运算符提取单个值,如下所示:

int size = x & 7;
int scale = (x >> 3) & 3;
int precision = (x >> 5) & 7;

重要提示:这假设各个值将被解释为正整数。如果值可能是负数,那么这将无法正常工作。给定变量的名称,这不太可能是一个问题。

答案 4 :(得分:1)

您可以通过按位算术执行此操作:

uint precision = (thatByte & 0xe0) >> 5,
    scale = (thatByte & 0x18) >> 3,
    size = thatByte & 7;