【问题标题】:How can we convert binary number into its octal number using c#?我们如何使用 c# 将二进制数转换为八进制数?
【发布时间】:2018-10-03 14:53:24
【问题描述】:

**嘿,我正在开发一个应用程序,它可以将任何基本数字(如(2、8、10、16 等))转换为用户所需的基本系统。我在将二进制数转换为八进制数时遇到问题,谁能帮帮我?

我试过了

// i am taking a binary number in value and then converting it to base 8

Int32 value = int.Parse(convertnumber);                           
Console.WriteLine(Convert.ToString(value, 8));

例如: 值=10011

答案应该是这个“23”,但使用上面的代码我得到“23433”

【问题讨论】:

  • 你试过Console.WriteLine(value)来查看数字的实际值吗?换句话说:我认为你的代码是正确的,但值与你认为的不同。

标签: c#


【解决方案1】:

“23433”是正确答案,将“10011”以 10 为底转换为 8 为底。

您可能打算将“10011”解释为二进制数。在这种情况下,您需要:

int value = Convert.ToInt32(convertnumber, 2);

编辑:为了响应 cmets,下面是几乎完整的代码:

string val = "10011";
int convertnumber = Convert.ToInt32(val, 2);
Console.WriteLine(Convert.ToString(convertnumber, 8)); // prints "23"

【讨论】:

  • 我想要 10011 二进制数转换为基数 8 数
  • @Pro_Zeck:我明白了。我的回答没有帮助吗?您想将字符串读入一个整数变量,将该字符串解释为以 2 为底的数字,正如我在上面演示的那样。然后,您希望将该整数表示为以 8 为基数,就像您在最后一行代码中所做的那样。
  • @SIMUCAL 代码运行良好。我仍然不知道为什么我们必须先将二进制转换为十进制,然后将十进制转换为八进制。
  • 为什么acn我们直接把二进制转八进制一定有办法?
  • @Pro_Zeck:你能详细说明一下吗?我在我的问题中使用的代码(参见我的编辑,带有一个几乎完整的程序)打印“23”。
【解决方案2】:
string binary = "10011";
int integer = Convert.ToInt32(binary, 2);
Console.WriteLine(Convert.ToString(integer, 8));

Output: 23

在此示例中,我们将二进制字符串表示形式转换为整数,并将整数转换为八进制字符串表示形式。

【讨论】:

  • 我们不能直接将二进制转换为八进制吗?
  • @Simucal,@Pro_Zeck:这个答案根本不会将任何内容转换为十进制。
  • @Timwi,怎么没有?从基数 2(二进制)到基数 10(十进制),然后从基数 10 到基数 8(八进制)。
  • @Simucal:您的代码(正确地)从二进制字符串表示转换为整数,然后从整数转换为八进制字符串表示。在这个过程中绝对没有 base-10 表示。
  • @Simucal 整数只是一个整数。只有整数的表示可以有一个基数。就像,当你把它写成一系列数字时。或者,当您将其作为一系列位存储在晶体管或电容器中时。但在语义上,存储在 C# 的“int”类型中的值根本没有没有基数
【解决方案3】:
int value = Convert.ToInt32(convertnumber, 2);
Console.WriteLine(Convert.ToString(value, 8));

您正在获取一个以 10 为底的数字 10011 并将其转换为以 8 为底的数字。即 23433。

【讨论】:

  • 你为什么称它为“转换为十进制”?任何地方都没有转换为十进制。
  • @Timwi:十进制数字系统(也称为以十为底或有时为十进制)以十为底
  • @Yuriy:不,真的吗?你不说!不过,您的代码中仍然没有小数点。 (当然不应该。代码是正确的。注释是错误的。)
  • @Yuriy:哈哈,不,不是……从来没有。你从哪里得到的?
  • @Yuriy: int 不是数字字符串。 int 不是字符序列。它是数字本身。它不在任何基地。 (当然,它在物理上是以 binary 的形式存储在内存中,但这无关紧要。)
【解决方案4】:

如果您想手动执行此操作(以便您了解发生了什么),这里有一个建议:

首先将二进制字符串填充为可被 3 整除(3 位 = 1 个八进制数字)

string binary = "10011";
int pad = binary.Length % 3;
binary = new string('0', 3-pad) + binary;

然后将每三位处理成一个八进制数

int n = binary.Length / 3;
char[] bin_digits = binary.ToCharArray();
char[] oct_digits = new char[n];
for (int i = 0; i < n; i++)
{
    int digit = bin_digits.Skip(3 * i).Take(3).Aggregate(0,
        (x, v) => (int)v - (int)'0' + 2 * x);
    // x is the value accumulation
    // v is a char '0' or '1' representing a bit and is converted to int 0, 1
    oct_digits[i] = (char)(digit + (int)'0');
    // convert int to char digit
}

将数字数组转换为字符串

string oct_value = new string(oct_digits);

示例结果: "10011" -&gt; "23" "11000" -&gt; "30" "1011011" -&gt; "133"

【讨论】:

  • 这真的很有帮助!现在我可以使用 c# 内置库轻松处理这个widout
【解决方案5】:

当然,int.Parse 会解析一个 十进制 数字。如果您的输入是二进制的,那么您需要先进行从二进制到整数的转换。

【讨论】:

    【解决方案6】:
    Int32 value = Convert.ToInt32( "10011", 2 );
    Console.WriteLine(Convert.ToString(value, 8)); 
    

    【讨论】:

      【解决方案7】:

      这是因为 int.Parse 将 10011 转换为十进制的 10011。它没有按照您的意愿将其从二进制 10011 转换为八进制 23(十进制 19)。

      【讨论】:

      • 在八进制(以 8 为基数)中,它是 23,而不是 19。OP 要求进行二进制到八进制的转换。
      猜你喜欢
      • 1970-01-01
      • 2015-09-15
      • 1970-01-01
      • 2021-09-10
      • 2017-02-19
      • 1970-01-01
      • 2017-02-18
      • 2017-09-27
      • 2018-05-23
      相关资源
      最近更新 更多