C# 十進制與二進制、十六進制、八進制之間的轉換


1.十進制 轉 二進制

   將十進制數不斷地除2,將所有余數倒敘填寫,即可得到所需二進制數據。

        public static string DecimalToBinary(int vDecimal)
        {
            /* 將十進制的數 vDecimal 不斷地除 2,取余數
             * 然后將余數 倒序 填寫
             */
            List<int> vYuShu = new List<int>();  // 除 2 過程中產生的余數集
            int vTempValue= vDecimal;            // 除 2 過程中產生的商數
            for (; ; )
            {
                int tempYS = vTempValue % 2;
                vYuShu.Add(tempYS);  // 記住余數

                vTempValue = vTempValue / 2;
                if (vTempValue == 0)  // 商數等於0時,結束運算
                    break;
            }
            // 倒序輸出
            string strBinary = "";
            for (int i = vYuShu.Count - 1; i >= 0; i--)
            {
                strBinary += vYuShu[i];
            }

            Console.WriteLine("Input decimal value:{0}, output binary value:{1}.", vDecimal, strBinary);

            return strBinary;
        }

 

2. 二進制 轉 十進制

   將二進制各位上的值(0或1)乘2的(n-1)次方,將每位結果相加。其中,n表示二進制中從右向左的位數(從1開始計);

        public static int BinaryToDecimal(string vBinary)
        {
            // 首先判斷是否滿足輸入要求
            int[] vInput = new int[vBinary.Length];
            for (int i = 0; i < vBinary.Length; i++)
            {
                var tempNum = vBinary[i].ToString();
                if (tempNum == "0")
                {
                    vInput[i] = 0;
                }
                else if (tempNum == "1")
                {
                    vInput[i] = 1;
                }
                else
                {
                    throw new Exception("輸入參數不正確,二進制數應僅由:0和1組成");
                }
            }
            /* 
             * 依次乘2的(n-1)次方,再求和
             */
            int vDecimal = 0;
            for (int i = 1; i <= vInput.Length; i++)
            {
                vDecimal += (int)(Math.Pow(2, i - 1) * vInput[vInput.Length-i]);
            }

            Console.WriteLine("Input binary value:{0}, output decimal value:{1}.", vBinary, vDecimal);

            return vDecimal;
        }

 

 

3. 自帶的轉換方式

    C#.Net自帶的進制轉換方式:

            int vDecimal = 99;
            // 【10】 → 【2】
            string vBinary = Convert.ToString(vDecimal, 2);
            Console.WriteLine("十進制數:{0},轉換成二進制:{1}", vDecimal, vBinary);

            // 【2】 → 【10】
            int tempDecimal = Convert.ToInt32(vBinary, 2);
            Console.WriteLine("二進制數:{0},轉換成十進制:{1}", vBinary, tempDecimal);

4. 十進制  <=>  十六進制

            int vDecimal = 127;
            // 【10】 → 【16】
            string vStrHex = "0x" + Convert.ToString(vDecimal, 16);
            Console.WriteLine("十進制數:{0},轉換成十六進制:{1}", vDecimal, vStrHex);

            // 【16】 → 【10】
            int tempDecimal = Convert.ToInt32(vStrHex, 16);
            Console.WriteLine("十六進制數:{0},轉換成十進制:{1}", vStrHex, tempDecimal);

  或者可以:

5. 十進制 <=> 八進制

6.  其它轉換

 

7. 有符號的數 二進制轉換

   對於有正負號的數據,在轉換時與上訴略有不同。

  1個字節(8個bits)它不管怎么樣還是只能表示256個數,因為有符號所以我們就把它表示成范圍:-128 → 127。

  用最高位表示符號位,0表示正數,1表示負數。

  10000000在計算機中表示最小的負整數。從10000001到 11111111依次表示-127到-1。

  負整數在計算機中是以補碼形式儲存的。

        public static int BinaryToDecimalWithSign(string vBinary)
        {
            // 首先判斷是否滿足輸入要求
            int[] vInput = new int[vBinary.Length];
            for (int i = 0; i < vBinary.Length; i++)
            {
                var tempNum = vBinary[i].ToString();
                if (tempNum == "0")
                {
                    vInput[i] = 0;
                }
                else if (tempNum == "1")
                {
                    vInput[i] = 1;
                }
                else
                {
                    throw new Exception("輸入參數不正確,二進制數應僅由:0和1組成");
                }
            }
            // -------- 不足8bits,補足 --------(非必需)
            if (vInput.Length % 8 != 0) // 補足8b、16b、、、
            {
                int nLen = (vInput.Length / 8 + 1) * 8;
                int[] nInput = new int[nLen];
                for (int i = 0; i < nLen - vInput.Length; i++)
                {
                    nInput[i] = vInput[0];
                }
                vInput.CopyTo(nInput, nLen - vInput.Length);

                vInput = nInput;
            }
            // ---------------------------------

            // 第1步:首位為1,則為負值
            int vFH = vInput[0];
            if (vFH == 1)
            {
                // ---------- 第2步:減去一 ----------
                for (int i = 1; i <= vInput.Length; i++)
                {
                    if (vInput[vInput.Length - i] == 1)
                    {
                        vInput[vInput.Length - i] = 0;
                        break;
                    }
                    else
                    {
                        vInput[vInput.Length - i] = 1;
                    }
                }

                // ---------- 第3步:取反 ----------
                for (int i = 0; i < vInput.Length; i++)
                {
                    vInput[i] = 1 - vInput[i];
                }
            }
            // ---------- 第4步:轉成10進制數 ----------
            int vDecimal = 0;
            for (int i = 1; i <= vInput.Length; i++)
            {
                vDecimal += (int)(Math.Pow(2, i - 1) * vInput[vInput.Length - i]);
            }
            if (vFH == 1) // 為負數
            {
                vDecimal = 0 - vDecimal;
            }

            Console.WriteLine("Input binary value:{0}, output decimal value:{1}.", vBinary, vDecimal);

            return vDecimal;
        }

 

[http://www.cnblogs.com/CUIT-DX037/]

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM