将 12 位 int 转换为 16 或 32 位

本文关键字:转换 int | 更新日期: 2023-09-27 18:36:07

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

变量 x = 0xFFF;

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

将 12 位 int 转换为 16 或 32 位

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 sbyte限制为 8 个,short 个限制为 16 个,int 个限制为 32 个,long 个限制为 64 个。同样,括号纯粹是装饰性的。减法比位移绑定得更紧密。

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

x = ( x & 0x800 ? x | 0xf000 : x );