所以我正在从一个字节数组中读取一个 12 位整数。该数字可能为负数,但我无法弄清楚如何将其转换为 c# 中的可用变量 int16/int32。有一种感觉,我需要对位移或其他按位运算做一些事情,但到目前为止我一直在努力。有人可以指出我正确的方向。
变量 x = 0xFFF;
这需要打印为 -1,但 c# 自然地转换为 int32 并打印为 4095。如果需要转换为 int16 或 int32,我如何保留负值。
所以我正在从一个字节数组中读取一个 12 位整数。该数字可能为负数,但我无法弄清楚如何将其转换为 c# 中的可用变量 int16/int32。有一种感觉,我需要对位移或其他按位运算做一些事情,但到目前为止我一直在努力。有人可以指出我正确的方向。
变量 x = 0xFFF;
这需要打印为 -1,但 c# 自然地转换为 int32 并打印为 4095。如果需要转换为 int16 或 int32,我如何保留负值。
32 位:
x = (x >> 11) == 0 ? x : -1 ^ 0xFFF | x;
没有条件的符号扩展,假设x
是一个已包含 12 位值的有符号短:
x = (x << 4) >> 4;
括号纯粹是为了理解发生了什么。与其他算术和逻辑运算符一样,位移位是左结合的。这样做的原因>>
是有符号类型的算术右移。这意味着,它不是在最高有效位移入零,而是根据需要多次复制 MSB。
通常从n
位到位的符号扩展m
将是:
x = (x << (m - n)) >> (m - n);
出于显而易见的原因m
,将限制为 8sbyte
个、16 个short
、32 个int
和 64 个long
。同样,括号纯粹是装饰性的。减法绑定比位移更紧密。
检测符号位并扩展它。对于 16 位:
x = ( x & 0x800 ? x | 0xf000 : x );