数据结构实验 第三单元 二进制转换

本文介绍了一种实现十进制与二进制相互转换的方法,支持带有小数部分的数字转换。通过栈和队列分别处理整数部分和小数部分,实现了精确的转换过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

十进制 → 二进制

/// <summary>
        /// 十进制转换为二进制,支持小数转换。
        /// </summary>
        /// <param name="strDec"></param>
        /// <returns></returns>
        private string DecToBin(string source)
        {
            int cur = 0;
            LinkedStack ls = new LinkedStack();
            LinkedQueue lq = new LinkedQueue();
            //获取整数部分
            for (cur = 0; cur < source.Length && source[cur] >= '0' && source[cur] <= '9'; cur++)
            { 
                //整数部分入栈
                ls.Push(source[cur]-'0');
            }
            //跳过小数点
            cur++;
            for (; cur < source.Length && source[cur] >= '0' && source[cur] <= '9'; cur++)
            {
                //小数部分入队
                lq.Push(source[cur]-'0');
            }
            //将字符串转换为实数类型

            //获取整数部分
            int intInt = 0;
            int fac = 1;
            while (!ls.Empty())
            {
                intInt += fac*int.Parse(ls.Pop().ToString());
                fac *= 10;
            }
            
            
            //获取小数部分
            double dbDec = 0;
            double dbFac = 0.1;
            while (!lq.Empty())
            {
                dbDec += dbFac * int.Parse(lq.Pop().ToString());
                dbFac *= 0.1;
            }



            //整数部分转换
            while (intInt!=0)
            {
                ls.Push(intInt % 2);
                intInt = intInt / 2;
            }
            if(ls.Empty())
            {
                ls.Push(0);
            }
            //小数部分是否为0
            while (dbDec != (double)((int)(dbDec)))
            {
                //取小数部分
                dbDec = dbDec - (double)((int)(dbDec));
                //乘二
                dbDec *= 2;
                //取整
                lq.Push((int)(dbDec));
            }
            //输出二进制
            
            System.Text.StringBuilder sb = new StringBuilder(100);

            //输出整数部分
           
            while (!ls.Empty())
            {
                sb.Append(ls.Pop());
            }
            if (!lq.Empty())
            {
                sb.Append(".");
            }
            while (!lq.Empty())
            {
                sb.Append(lq.Pop());
            }
            return sb.ToString();
        }


二进制 → 十进制

/// <summary>
        /// 二进制转换为十进制,支持小数转换。
        /// </summary>
        /// <param name="strBin"></param>
        /// <returns></returns>
        private double BinToDec(string source)
        {
            int cur = 0;
            LinkedStack ls = new LinkedStack();
            LinkedQueue lq = new LinkedQueue();
            //获取整数部分
            for (cur = 0; cur < source.Length && source[cur] >= '0' && source[cur] <= '1'; cur++)
            {
                //整数部分入栈
                ls.Push(source[cur] - '0');
            }
            //跳过小数点
            cur++;
            for (; cur < source.Length && source[cur] >= '0' && source[cur] <= '1'; cur++)
            {
                //小数部分入队
                lq.Push(source[cur] - '0');
            }
            //
            int intFac = 1;
            double ans = 0;
            while (!ls.Empty())
            {
                ans += intFac * int.Parse(ls.Pop().ToString());
                intFac *= 2;
            }
            double dbFac = 0.5;
            while (!lq.Empty())
            {
                ans += dbFac * int.Parse(lq.Pop().ToString());
                dbFac *= 0.5;
            }
            return ans;
        }




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值