看板 C_Sharp 關於我們 聯絡資訊
※ 引述《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); -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.232.114.250 ※ 文章網址: https://www.ptt.cc/bbs/C_Sharp/M.1460466596.A.D43.html
Litfal: 認真回給推,這個做法比較符合C#精神,適合不熟bitwise的 04/12 21:48
Litfal: 但其實原問題用unsigned也能解ww 04/12 21:49
※ 編輯: m339606 (36.232.114.250), 04/12/2016 21:53:43
Litfal: Convert.ToString(a, 2) 04/12 22:14
Litfal: 順便一提,輸出二進位字串可以用 (這行沒推到@@) 04/12 22:15
dabiddabid: 用BitConverter解決了,感謝大家 04/18 09:21