2012-06-04 239 views
5

所以我从字节数组中读取一个12位整数。该数字可以是负数,但我不知道如何将其转换为c#中的可用变量int16/int32。有一种感觉,我需要做一些转变或其他按位操作的事情,但我迄今一直在引人注目。有人能指引我走向正确的方向吗?将12位int转换为16位或32位

var x = 0xFFF;

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

回答

13

32位:

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

很好,非常感谢!介意解释这里发生了什么?我知道>>^|但不完全理解。 – Clarke76

+2

基本右移,直到只剩下符号位。如果它是零,那么我们只返回原始值。如果它是1,那么我们取-1(0xFFFFFFFF),关掉低12位('xor'),然后用原始值或'或'打开它中的位。结果基本上只是打开32位值的高20位。 –

+0

是啊......我最终把它全部写在纸上,看到发生了什么。这真的有帮助。我为了得到最后一点将被用作负面的标志。之后,很容易遵循。再次感谢。 – Clarke76

8

符号扩展没有条件语句,假设x是签订短期已经包含了12位的值:

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

括号纯粹是为了了解发生了什么事情。位移与其他算术逻辑运算符一样是左关联的。这项工作的原因在于>>是一种签名类型的算术右移。这意味着,不是在最高位移入零,而是根据需要多次复制MSB。然后在一般

符号扩展从nm比特将是:

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

m对于将被限制到8 sbyte显而易见的原因,16 short,32 int和64 long。再次,括号是纯粹的美容。减法绑定比位移更紧密。

0

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

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