2012-06-04 242 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);