Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用c#将二进制数转换为八进制数?_C# - Fatal编程技术网

如何使用c#将二进制数转换为八进制数?

如何使用c#将二进制数转换为八进制数?,c#,C#,**嘿,我正在开发一个应用程序,它可以将任何基数(如(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(Con

**嘿,我正在开发一个应用程序,它可以将任何基数(如(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”

“23433”是正确的答案,当将基数10中的“10011”转换为基数8时

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

int value = Convert.ToInt32(convertnumber, 2);
编辑:回应评论,这里是几乎完整的代码:

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

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

int value = Convert.ToInt32(convertnumber, 2);
Console.WriteLine(Convert.ToString(value, 8));

您正在将基数为10的数字10011转换为基数为8的数字。这是23433。

这是因为int.Parse正在将10011转换为十进制的10011。它不是按照您的要求将其从10011二进制转换为23八进制(19十进制)

Int32 value = Convert.ToInt32( "10011", 2 );
Console.WriteLine(Convert.ToString(value, 8)); 
string binary = "10011";
int integer = Convert.ToInt32(binary, 2);
Console.WriteLine(Convert.ToString(integer, 8));

Output: 23

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

如果您想手动执行此操作(以便了解发生的情况),请给出一个建议:

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

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

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
}
示例结果:
“10011”->“23”
“11000”->“30”

“1011011”->“133”

您是否尝试了
控制台。写入线(值)
以查看数字的实际值?换句话说:我认为您的代码是正确的,但值与您认为的不同。在八进制(以8为基数)中,它是23,而不是19。OP要求进行二进制到八进制的转换。我想把10011二进制数转换成8进制number@Pro_Zeck:我明白了。我的回答没有帮助吗?您希望将字符串读入一个整数变量,将该字符串解释为基数为2的数字,正如我在上面演示的那样。然后,您希望将该整数表示为以8为基数,就像您在最后一行代码中得到的那样。@SIMUCAL代码工作得很好。我仍然不知道为什么我们必须先把二进制转换成十进制,然后再把十进制转换成八进制。为什么我们直接把二进制转换成八进制呢?一定有办法吗?@Pro_Zeck:你能详细解释一下吗?我在问题中使用的代码(见我的编辑,几乎完整的程序)打印“23”。我们不能直接将二进制转换为八进制吗?@Simucal,@Pro_-Zeck:这个答案根本不能将任何东西转换为十进制。@Timwi,怎么不能呢?从基数2(二进制)到基数10(十进制),然后从基数10到基数8(八进制)。@Simucal:您的代码(正确地)将二进制字符串表示形式转换为整数,然后从整数转换为八进制字符串表示形式。在这个过程中,任何地方都没有以10为基数的表示。@Simucal这个整数就是一个整数。只有整数的表示才能有基数。比如,当你把它写成一系列数字的时候。或者,当你把它作为一系列位存储在晶体管或电容器中时。但从语义上讲,C#的“int”类型中存储的值根本没有基,为什么称之为“convert to decimal”?任何地方都不能转换为十进制。@Timwi:十进制数字系统(也称为十进制或偶而称为十进制)以十为其单位base@Yuriy:不,真的吗?你没说!但代码中仍然没有小数点。(当然不应该。代码是正确的。注释是错误的。)@Yuriy:LOL,不,不是。。。从来没有。你从哪里得到的?@Yuriy:int不是一串数字。
int
不是字符序列。这是数字本身。它不在任何基地。(当然,物理上它是以二进制形式存储在内存中的,但这与此无关。)这真是太好了!现在,我可以使用c#内置库轻松处理此widout
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);