以下是优化后的二进制转十进制代码,主要从算法效率、类型范围和代码简洁性三个方面进行了改进:
主要优化点说明:
- 算法效率提升:
- 移除了
Math.Pow
的使用(浮点运算开销大),改用位运算<< 1
(左移1位等价于×2)和按位或|
,运算效率显著提高 - 采用累加器模式,一次遍历完成计算,时间复杂度保持O(n)但常数项大幅降低
- 范围扩展:
- 使用
long
类型替代int
,支持最长63位的二进制数(含符号位),转换范围扩大到±9,223,372,036,854,775,807
- 代码精简:
- 合并了计算逻辑,减少中间变量
- 验证逻辑早期退出,避免不必要的循环
- 用字符ASCII码运算
binary[i] - '0'
替代int.Parse
,减少类型转换开销
- 保持健壮性:
- 依然严格验证输入格式
- 正确处理负数情况
- 边缘 case(如"0"、"1"等)处理更清晰
对于超长二进制数(超过64位),可以进一步改为使用BigInteger
类型,但会牺牲一定性能。当前版本在保持高性能的同时,已经能满足绝大多数日常使用场景。
using System;class OptimizedBinaryToDecimal
{static void Main(){Console.WriteLine("二进制转十进制转换器(优化版)");Console.WriteLine("---------------------------");Console.Write("请输入二进制数: ");string binary = Console.ReadLine()?.Trim();if (IsValidBinary(binary)){// 优化:使用long支持更大范围的二进制数long result = BinaryToDecimal(binary);Console.WriteLine($"转换结果: {result}");}else{Console.WriteLine("无效的二进制数!仅允许0、1和可选的前导负号。");}Console.WriteLine("\n按任意键退出...");Console.ReadKey();}/// <summary>/// 验证二进制字符串有效性(优化版)/// </summary>static bool IsValidBinary(string binary){if (string.IsNullOrEmpty(binary))return false;int start = binary[0] == '-' ? 1 : 0;// 二进制数至少需要1位有效数字if (start >= binary.Length)return false;// 只检查必要的字符,早期退出for (int i = start; i < binary.Length; i++){if (binary[i] != '0' && binary[i] != '1')return false;}return true;}/// <summary>/// 二进制转十进制(高效算法)/// 优化点:移除Math.Pow,改用位运算和累加器提升性能/// </summary>static long BinaryToDecimal(string binary){bool isNegative = binary[0] == '-';int startIndex = isNegative ? 1 : 0;long result = 0;// 高效算法:每一步左移1位(相当于×2)再加上当前位值for (int i = startIndex; i < binary.Length; i++){// 位运算替代乘法:result = result * 2 + (当前位值)result = (result << 1) | (binary[i] - '0');}return isNegative ? -result : result;}
}