所以我從字節數組中讀取一個12位整數。該數字可以是負數,但我不知道如何將其轉換爲c#中的可用變量int16/int32。有一種感覺,我需要做一些轉變或其他按位操作的事情,但我迄今一直在引人注目。有人能指引我走向正確的方向嗎?將12位int轉換爲16位或32位
var x = 0xFFF;
這需要打印爲-1,但c#自然轉換爲int32並打印輸出爲4095.如果需要轉換爲int16或int32,我該如何保留負值。
所以我從字節數組中讀取一個12位整數。該數字可以是負數,但我不知道如何將其轉換爲c#中的可用變量int16/int32。有一種感覺,我需要做一些轉變或其他按位操作的事情,但我迄今一直在引人注目。有人能指引我走向正確的方向嗎?將12位int轉換爲16位或32位
var 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
對於將被限制到8 sbyte
顯而易見的原因,16 short
,32 int
和64 long
。再次,括號是純粹的美容。減法綁定比位移更緊密。
檢測符號位並擴展它。對於16位:
x = (x & 0x800 ? x^0xf000 : x);
很好,非常感謝!介意解釋這裏發生了什麼?我知道>>^|但不完全理解。 – Clarke76
基本右移,直到只剩下符號位。如果它是零,那麼我們只返回原始值。如果它是1,那麼我們取-1(0xFFFFFFFF),關掉低12位('xor'),然後用原始值或'或'打開它中的位。結果基本上只是打開32位值的高20位。 –
是啊......我最終把它全部寫在紙上,看到發生了什麼。這真的有幫助。我爲了得到最後一點將被用作負面的標誌。之後,很容易遵循。再次感謝。 – Clarke76