在C#中将整数转换为二进制

274

如何将整数转换为二进制表示形式?

我正在使用以下代码:

String input = "8";
String output = Convert.ToInt32(input, 2).ToString();

但它会抛出一个异常:

找不到任何可解析的数字


1
你是想将数字的字符串表示转换成实际数字,还是想将其转换为十进制或整数?你的示例并不真正符合你的问题。 - womp
如果你想将十进制转换为字节,你可以使用这段代码:https://gist.github.com/eranbetzalel/5384006#file-decimalbytesconvertor-cs - Eran Betzalel
2
你试图将一个十进制字符串解析为二进制。这就是调用失败的原因。 - R.J. Dunnill
22个回答

546

您的示例包含一个表示为字符串的整数。假设您的整数实际上是整数,并且您想将该整数转换为二进制字符串。

int value = 8;
string binary = Convert.ToString(value, 2);

返回1000。


1
有没有类似的方法将二进制转换为十进制? - kashif
53
@kashif 的代码 int value = Convert.ToInt32("1101", 2) 将会给变量 value 赋值为 13。 - flindeberg
这是如何工作的? "2" 是基数,适用于任何基数吗? - Xonatron
2
@Xonatron:https://learn.microsoft.com/en-us/dotnet/api/system.convert.tostring?view=net-5.0#System_Convert_ToString_System_Int32_System_Int32_ - Anthony Pegram

60

在C#中将任意经典进制转换为任意进制

string number = "100";
int fromBase = 16;
int toBase = 10;

string result = Convert.ToString(Convert.ToInt32(number, fromBase), toBase);

// result == "256"

支持的进制包括2、8、10和16进制。


1
这是行不通的。我只是尝试了 string binary = Convert.ToString(533, 26);,结果抛出了 ArgumentException: Invalid base。 - Magnum
8
是的,来自 MSDN 的信息:只支持经典进制。 http://msdn.microsoft.com/zh-cn/library/8s62fh68(v=vs.110).aspx toBase 类型:System.Int32 返回值的进制。进制必须是 2、8、10 或 16。 - sritmak

41

非常简单,没有多余的代码,只需输入、转换和输出。

using System;

namespace _01.Decimal_to_Binary
{
    class DecimalToBinary
    {
        static void Main(string[] args)
        {
            Console.Write("Decimal: ");
            int decimalNumber = int.Parse(Console.ReadLine());

            int remainder;
            string result = string.Empty;
            while (decimalNumber > 0)
            {
                remainder = decimalNumber % 2;
                decimalNumber /= 2;
                result = remainder.ToString() + result;
            }
            Console.WriteLine("Binary:  {0}",result);
        }
    }
}

1
对于通用字母表,应该这样做{ [...] }while(decimalNumber > 0); - Stefan Steiger
1
如果decimalNumber = 0,则结果为空。请更新为while(decimalNumber> 0 || string.IsNullOrEmpty(result))。 - akkapolk

15

http://zamirsblog.blogspot.com/2011/10/convert-decimal-to-binary-in-c.html

    public string DecimalToBinary(string data)
    {
        string result = string.Empty;
        int rem = 0;
        try
        {
            if (!IsNumeric(data))
                error = "Invalid Value - This is not a numeric value";
            else
            {
                int num = int.Parse(data);
                while (num > 0)
                {
                    rem = num % 2;
                    num = num / 2;
                    result = rem.ToString() + result;
                }
            }
        }
        catch (Exception ex)
        {
            error = ex.Message;
        }
        return result;
    }

2
不确定这与Xenon的答案有何不同。 - Joshua Drake
6
他在氙之前已经回答了这个问题。 - Reza Taibur

12

原始的方法:

public string ToBinary(int n)
{
    if (n < 2) return n.ToString();

    var divisor = n / 2;
    var remainder = n % 2;

    return ToBinary(divisor) + remainder;
}

3
虽然在否定情况下无法奏效,但我仍然点了赞,因为这是一个有趣的回答。 - BrainSlugs83
感谢您的反馈@BrainSlugs83。 - Daniel B

10

另一种使用EnumerableLINQ的内联解决方案是:

int number = 25;
    
string binary = Enumerable.Range(0, (int)Math.Log(number, 2) + 1).Aggregate(string.Empty, (collected, bitshifts) => ((number >> bitshifts) & 1 ) + collected);

1
在尝试了这里的许多(但不是全部)非BCL答案之后,这是我发现的第一个真正有效的答案。它们中的大多数都失败得惨不忍睹。 - InteXX
2
谢谢您发现我的代码 :) 但是正如您所看到的,从性能角度来看,它只是个玩笑。 - Sanan Fataliyev
好吧,我们不能拥有一切,对吧?;-) - InteXX
1
这个回答真的让我笑了。给你点赞,你值得拥有它。 - BrainSlugs83

8
Convert.ToInt32(string, base)并不会将数字转换成指定的进制,它假设输入的字符串已经是指定进制下的合法数字,并将其转换为十进制。因此,你在使用base为2时出现错误,因为"8"并不是二进制中的合法数字。
String str = "1111";
String Ans = Convert.ToInt32(str, 2).ToString();

将显示15(1111二进制= 15十进制)

String str = "f000";
String Ans = Convert.ToInt32(str, 16).ToString();

将显示61440


6
    static void convertToBinary(int n)
    {
        Stack<int> stack = new Stack<int>();
        stack.Push(n);
        // step 1 : Push the element on the stack
        while (n > 1)
        {
            n = n / 2;
            stack.Push(n);
        }

        // step 2 : Pop the element and print the value
        foreach(var val in stack)
        {
            Console.Write(val % 2);
        }
     }

1
你好!你应该在你发布的代码中添加一些注释 :) - toshiro92
1
这个函数将在C#中把整数转换为二进制。为了将整数转换为二进制,我们重复用基数除商,直到商为零,在每一步中记录余数(使用Stack.Push存储值)。然后,我们倒序写入余数,从底部开始每次附加到右侧(通过循环遍历堆栈打印值)。 - rahul sharma

4
using System;

class Program 
{
    static void Main(string[] args) {

        try {

            int i = (int) Convert.ToInt64(args[0]);
            Console.WriteLine("\n{0} converted to Binary is {1}\n", i, ToBinary(i));

        } catch(Exception e) {
            Console.WriteLine("\n{0}\n", e.Message);
        }
    }

    public static string ToBinary(Int64 Decimal) {
        // Declare a few variables we're going to need
        Int64 BinaryHolder;
        char[] BinaryArray;
        string BinaryResult = "";

        while (Decimal > 0) {
            BinaryHolder = Decimal % 2;
            BinaryResult += BinaryHolder;
            Decimal = Decimal / 2;
        }

        BinaryArray = BinaryResult.ToCharArray();
        Array.Reverse(BinaryArray);
        BinaryResult = new string(BinaryArray);

        return BinaryResult;
    }
}

11
你正在重新发明轮子。BCL中已经包含了实现这个的方法。 - Eltariel

4
我知道这个答案看起来与这里的大多数答案相似,但我注意到几乎没有人使用for循环。这段代码可以工作,并且可以被认为是简单的,因为它不需要任何特殊的函数,比如带参数的ToString(),而且也不太长。也许有些人更喜欢for循环而不仅仅是while循环,这可能适合他们。
public static string ByteConvert (int num)
{
    int[] p = new int[8];
    string pa = "";
    for (int ii = 0; ii<= 7;ii = ii +1)
    {
        p[7-ii] = num%2;
        num = num/2;
    }
    for (int ii = 0;ii <= 7; ii = ii + 1)
    {
        pa += p[ii].ToString();
    }
    return pa;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接