将12位int转换为16位或32位

时间:2012-06-04 04:18:42

标签: c# bit-manipulation

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

var x = 0xFFF;

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

3 个答案:

答案 0 :(得分:13)

32位:

x = (x >> 11) == 0 ? x : -1 ^ 0xFFF | x;

答案 1 :(得分:8)

在没有条件的情况下签名扩展,假设x是已包含12位值的签名短消息:

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

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

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

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

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

答案 2 :(得分:1)

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

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