Re: [問題] 負數處理

作者: m339606 (mize)   2016-04-12 21:09:51
※ 引述《dabiddabid (dabid')》之銘言:
: 小弟要將兩個Int16數字組成Int32
: Int16 a = -30 ;//1111 1111 1110 0010
: Int16 b = -19456 ; //1011 0100 0000 0000
: 現在想把ab組合在一起成Int32(ab)//1111 1111 1110 0010 1011 0100 0000 0000
: 原本是想將兩個都先ToInt32將a << 16 然後(a | b)
: 但現在發現負數Int16轉Int32會將前面全部補1
: b會變成1111 1111 1111 1111 1011 0100 0000 0000
: 但我想要的是0000 0000 0000 0000 1011 0100 0000 0000
: 也就是想要a|b結果是-1920000//11111111111000101011010000000000
: 但實際現在結果卻是-19456 //11111111111111111011010000000000
: 請問這要如何解決?
因為你沒有指定是Big Endian還是Little Endian
按照你給的範例直接使用預設的Little Endian來轉換
Int16 a = -30;
var a_bits = new BitArray(BitConverter.GetBytes(a));
string a_bitsString = "";
for (int i = 0; i < a_bits.Count; i++)
a_bitsString += a_bits[i] ? "1" : "0";
Console.WriteLine(a_bitsString);
輸出後結果為a = 0100 0111 1111 1111 與你文中指出的順序是顛倒的
所以你使用的應該是Big Endian
然後按照你文中的要求感覺就是將兩個數字的bytes組合起來
那程式碼應該是如下
Int16 a = -30;
Int16 b = -19456;
List<byte> temp = new List<byte>();
temp.AddRange(BitConverter.GetBytes(a));
temp.AddRange(BitConverter.GetBytes(b));
int c = BitConverter.ToInt32(temp.ToArray(), 0);
作者: Litfal (Litfal)   2016-04-12 21:48:00
認真回給推,這個做法比較符合C#精神,適合不熟bitwise的但其實原問題用unsigned也能解wwConvert.ToString(a, 2)順便一提,輸出二進位字串可以用 (這行沒推到@@)
作者: dabiddabid (dabid')   2016-04-18 09:21:00
用BitConverter解決了,感謝大家

Links booklink

Contact Us: admin [ a t ] ucptt.com