6

所以我正在从一个字节数组中读取一个 12 位整数。该数字可能为负数,但我无法弄清楚如何将其转换为 c# 中的可用变量 int16/int32。有一种感觉,我需要对位移或其他按位运算做一些事情,但到目前为止我一直在努力。有人可以指出我正确的方向。

变量 x = 0xFFF;

这需要打印为 -1,但 c# 自然地转换为 int32 并打印为 4095。如果需要转换为 int16 或 int32,我如何保留负值。

4

3 回答 3

13

32 位:

x = (x >> 11) == 0 ? x : -1 ^ 0xFFF | x;
于 2012-06-04T04:25:37.697 回答
8

没有条件的符号扩展,假设x是一个已包含 12 位值的有符号短:

x = (x << 4) >> 4;

括号纯粹是为了理解发生了什么。与其他算术和逻辑运算符一样,位移位是左结合的。这样做的原因>>是有符号类型的算术右移。这意味着,它不是在最高有效位移入零,而是根据需要多次复制 MSB。

通常从n位到位的符号扩展m将是:

x = (x << (m - n)) >> (m - n);

出于显而易见的原因m,将限制为 8sbyte个、16 个short、32 个int和 64 个long。同样,括号纯粹是装饰性的。减法绑定比位移更紧密。

于 2012-06-04T05:05:22.460 回答
1

检测符号位并扩展它。对于 16 位:

x = ( x & 0x800 ? x | 0xf000 : x );
于 2015-09-18T06:11:39.357 回答