我正在从一个字节读取一些值。我在用户手册中告诉我,这一个字节包含3个不同的值。有一个看起来像这样的表:
我认为这意味着精度占用3位,比例占2,大小占3,总共8(1字节)。
我不清楚的是:
1 - 为什么它被标记为7到0而不是0到7(可能与有意义有关?)
2 - 如何从该一个字节中提取单个值?
答案 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输出:
答案 2 :(得分:5)
Potayto,potahto。
您可以使用移位和遮罩来平滑不需要的位,例如:
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;