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输出:
-
Potayto,potahto。
-
您可以使用移位和掩码来平滑不需要的位,例如:
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;