将 12 位 int 转换为 16 或 32 位
本文关键字:转换 int | 更新日期: 2023-09-27 18:36:07
所以我正在从字节数组中读取一个 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
sbyte
限制为 8 个,short
个限制为 16 个,int
个限制为 32 个,long
个限制为 64 个。同样,括号纯粹是装饰性的。减法比位移绑定得更紧密。
检测符号位并扩展它。对于 16 位:
x = ( x & 0x800 ? x | 0xf000 : x );