【问题标题】:Binary to Decimal Conversion doesn't work二进制到十进制转换不起作用
【发布时间】:2015-10-21 03:35:22
【问题描述】:

这是一个时髦的程序。出于某种原因,它在二进制输入类似于 101 时起作用。然后它不适用于 1000。这有点奇怪。有人可以解释一下吗?

class Program
{
    static void Main()
    {         
            string binary = "xxx";
            double decimalValue = 0;

            Console.WriteLine("Enter in a binary number:");
            binary = Console.ReadLine();

            for (int i = 0; i < binary.Length; i++)
            {
                Console.WriteLine("Length is: {0}", binary.Length);

                if (binary[i] == 49)  //Look at that
                    decimalValue = decimalValue + Math.Pow(2, i);
            }

            Console.WriteLine("The decimal equivalent value is {0}", decimalValue);

            Console.ReadLine();
    }
}

它的核心当然是 if (binary[i] == 49)

我只是为了自学一些 C#。有人能告诉我除了 49 以外的右侧要放什么,这是“1”的 ASCII 数字。如果我输入“1”,我会收到一条错误消息,提示您无法将字符串与字符进行比较。

任何帮助将不胜感激。我不想使用预先转换为二进制的方法,因为这应该是一个可教的时刻。

【问题讨论】:

  • 提示:试试Math.Pow(2, binary.Length - i - 1) ;)
  • 一个字符文字用单引号括起来:'1'.
  • 如果你不能比较一个字符串和一个字符,你为什么不尝试将一个转换成另一个呢?您还可以尝试将字符串解析(提示)为整数,以查看它是 1 还是 0。
  • “1”适用于 101,但不适用于 1000。不过,它比 49 的神秘值要好。

标签: c# binary


【解决方案1】:

你读错了字符。

正如 Lucas Trzesniewski 在对该问题的第一条评论中立即所说的那样,将 for 循环中 i 的一次使用(不是两者)替换为 binary.Length - 1 - i

它适用于"101" 的原因是这是一个回文(向后读相同)。

注意:49'1' 的 ASCII 码。使用== '1' 比使用== 49 更具可读性。但是,两者都同样有效。在 C# 中,如果使用单引号,则会得到 char 值,如 '1',如果使用双引号,则会得到 string 对象引用,"1"

您应该删除带有"xxx" 的内容。它没有任何功能。就做string binary = Console.ReadLine();

【讨论】:

  • 谢谢。我真的不知道字符串中的第零个字符是最左边的。现在我知道了。
【解决方案2】:

您可以采用另一种方法:移位和加法,而不是尝试根据其位置添加每个单独位的值。在这种方法中,您将当前值向左移动(将该值乘以 2)并添加当前位。

例如:二进制值1010在四个周期内变为十进制10:

value = 0
value *= 2 => value = 0
value += bit 1 => value = 1
value *= 2 => value = 2
value += bit 0 => value = 2
value *= 2 => value = 4
value += bit 1 => value = 5
value *= 2 => value = 10
value += bit 0 => value = 10

或者,在代码中:

using System;

public class Program
{
    public static void Main()
    {
        string binary = "";
        double decimalValue = 0;

        Console.WriteLine("Enter in a binary number:");
        binary = Console.ReadLine();

        for (int i = 0; i < binary.Length; i++)
        {
            decimalValue *=2; // shift current value to the left
            if (binary[i] == 49)
            {
                decimalValue += 1; // add current bit
            }   
            Console.WriteLine("Current value: {0}", decimalValue);
        }
        Console.WriteLine("The decimal equivalent value is {0}", decimalValue);
        Console.ReadLine();
    }
}

【讨论】:

  • 仅供参考:您也可以使用long 类型而不是double,在这种情况下您可以编写fancy &lt;&lt;= operator: decimalValue &lt;&lt;= 1; 而不是decimalValue *= 2; :-)跨度>
猜你喜欢
  • 2016-01-17
  • 2016-05-18
  • 2023-04-11
  • 1970-01-01
  • 2016-02-09
  • 2016-08-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多