Re: [問題] 負數處理

看板C_Sharp (C#)作者 (mize)時間9年前 (2016/04/12 21:09), 9年前編輯推噓2(203)
留言5則, 2人參與, 最新討論串2/2 (看更多)
※ 引述《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

04/12 21:48, , 1F
認真回給推,這個做法比較符合C#精神,適合不熟bitwise的
04/12 21:48, 1F

04/12 21:49, , 2F
但其實原問題用unsigned也能解ww
04/12 21:49, 2F
※ 編輯: m339606 (36.232.114.250), 04/12/2016 21:53:43

04/12 22:14, , 3F
Convert.ToString(a, 2)
04/12 22:14, 3F

04/12 22:15, , 4F
順便一提,輸出二進位字串可以用 (這行沒推到@@)
04/12 22:15, 4F

04/18 09:21, , 5F
用BitConverter解決了,感謝大家
04/18 09:21, 5F
文章代碼(AID): #1N3FEar3 (C_Sharp)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
文章代碼(AID): #1N3FEar3 (C_Sharp)