所以我从字节数组中读取一个12位整数。这个数字可能是负数,但我无法弄清楚如何将其转换为c#中的可用变量int16 / int32。有一种感觉我需要用位移或其他按位操作做一些事情,但到目前为止我一直在罢工。有人能指出我正确的方向。
var x = 0xFFF;
这需要打印为-1,但c#自然地转换为int32并打印为4095.如果需要转换为int16或int32,我如何保留负值。
答案 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 );